【问题标题】:changing parent element if one of the children nodes has certain context using xslt如果其中一个子节点具有使用 xslt 的特定上下文,则更改父元素
【发布时间】:2019-01-10 01:11:07
【问题描述】:

我有以下 XML:

<vce>
<document url="https://amdocssandbox.service-now.com/aps/? 
table=sn_customerservice_aps_and_optima_cases&sys_id=300384- 
040406&id=aps_case_details" vse-key-normalized="vse-key-normalized">
<content name="Knowledge_Item_type" type="text">Case</content>
<content name="Knowledge_item_ID" type="text" name-original="Case_ID">300384- 
040406</content>
<content name="PSP_update_dt" type="text" name- 
original="PSP_Case_update_dt">1900-01-01 00:00:00.0000000</content>
<content name="Item_URL_internal" type="text" name- 
original="Case_URL_internal">
https://amdocssandbox.service-now.com/aps/? 
table=sn_customerservice_aps_and_optima_cases&sys_id=300384- 
040406&id=aps_case_details
</content>
<content name="Item_URL_external" type="text" name- 
original="Case_URL_external">
https://amdocssandbox.service-now.com/aps/? 
table=sn_customerservice_aps_and_optima_cases&sys_id=300384- 
040406&id=aps_case_details
</content>
<content name="Product_tree" type="text">^ > ^ > ^ > ^</content>
<content name="User_type" type="text" action="none">n/a</content>
<content name="Last_updated_date" type="text">2017-07-27 
08:32:56.0000000</content>
<content name="Sort_Date" type="text" action="none">1501133576</content>
<content name="Knowledge_item_name" type="text" name- 
original="Case_title">Unable to write Statistics when Gatherer</content>
<content name="instacne_ID" type="text" name- 
original="Instance_ID">f52ec8d04f5c43000aa036e18110c771</content>
<content name="Business_line" type="text" name- 
original="business_line">APS</content>
 </document>
</vce>

如果某些内容等于某个值,我的目标是将此XML 转换为空。 例如if content[@name = 'Knowledge_item_ID'] /text() = '300384- 040406' 我想清空所有其他内容的值,意思是:

<vce>
 <document>
   <content/>
   <content/> 
      .
      .
      .
   <content/>
 <document/>
</vce>

我对@9​​87654325@ 很陌生,如果内部节点具有特定值,我不确定如何使所有节点为空。

谢谢!

【问题讨论】:

    标签: xml xslt xpath transform


    【解决方案1】:

    首先请注意您的 XML 格式不正确,因为您在某些需要转义的属性中使用了 &amp;...

    <document url="https://amdocssandbox.service-now.com/aps/?table=sn_customerservice_aps_and_optima_cases&amp;sys_id=300384-040406&amp;id=aps_case_details" ...
    

    (您的属性名称中也有换行符,这也会导致问题)

    但是假设你有格式良好的 XML,你想要的表达式是这样的

    <xsl:template match="*[content[@name='Knowledge_item_ID'] = '300384-040406']/content">
    

    在此模板中,您只需创建一个空的content 元素。

    这将与身份模板结合使用以处理任何其他元素

    试试这个 XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" />
    
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="*[content[@name='Knowledge_item_ID'] = '300384-040406']/content">
        <xsl:copy />
      </xsl:template>
    </xsl:stylesheet>
    

    http://xsltfiddle.liberty-development.net/jyH9rMw

    编辑:在回答您的评论时,如果您确实想删除 document 元素,只留下 vce 元素,请尝试这样做

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" />
    
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="document[content[@name='Knowledge_item_ID'] = '300384-040406']" />
    
    </xsl:stylesheet>
    

    在这个解决方案中,第一个模板是身份模板,它只是跨节点复制而不变。

    第二个模板具有更高的优先级,因此将首先匹配,它将匹配包含content 元素的document 元素,其中“Knowledge_item_ID”等于“300384-040406”。在这种情况下,模板什么都不做,因此不会将 document 元素复制到输出中。

    如果document 元素没有匹配的“Knowledge_item_ID”,则只有身份模板会匹配它,然后原封不动地复制它。

    http://xsltfiddle.liberty-development.net/jyH9rMw/1

    【讨论】:

    • 嗨蒂姆,谢谢你的回答。我在 Watson Explorer 应用程序(由 IBM)中使用它。 XML是由应用程序创建的XML,我正在尝试转换它(它是一个创建搜索引擎的应用程序,我想清空内容以确保某些文档没有被索引。)以下代码清空所有文档: 并且此代码更改,例如, content 的值(附在下个cmets-没有更多的空间)
    • 我无法将它们组合在一起 - 如果模板匹配,我想要帽子将清空 vce
    • 很遗憾您提供的代码在应用程序中不起作用
    • 您可能需要编辑您的问题以显示您的 XML 和预期输入的更好示例,因为我现在不确定您的实际要求是什么。对不起。
    • 嗨 TIM 我误导了你请求的输出只是 - 这意味着我需要删除其他标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多