使用 XSLT 过滤不包含节点的 XYZ

Posted

技术标签:

【中文标题】使用 XSLT 过滤不包含节点的 XYZ【英文标题】:Filter XYZ not containing nodes using XSLT 【发布时间】:2021-10-25 18:27:01 【问题描述】:

我是 xslt 转换的新手,我们需要使用 xslt 进行有效负载转换 您能帮我过滤不包含以下输入节点的 XYZ 吗

输入:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Test>
<responseStatus>SUCCESS</responseStatus>
<responseDetails>
    <limit>1000</limit>
    <offset>0</offset>
    <size>55</size>
    <total>55</total>
</responseDetails>
<data>
    <row>
        <id>131</id>
        <documentNumber>123</documentNumber>
        <version>131_1_0</version>
        <title__v>test</title__v>
        <document_business_unit__cr.name__v>
            <value>Global XYZ</value>
        </document_business_unit__cr.name__v>
    </row>
    <row>
        <id>131</id>
        <documentNumber>123</documentNumber>
        <version>131_1_0</version>
        <title__v>test</title__v>
        <document_business_unit__cr.name__v>
            <value>Local XYZ</value>
        </document_business_unit__cr.name__v>
    </row>
    <row>
        <id>131</id>
        <documentNumber>123</documentNumber>
        <version>131_1_0</version>
        <title__v>test</title__v>
        <document_business_unit__cr.name__v>
            <value>Global</value>
        </document_business_unit__cr.name__v>
    </row>
</data>
</Test>

期望的输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Test>
<responseStatus>SUCCESS</responseStatus>
<responseDetails>
    <limit>1000</limit>
    <offset>0</offset>
    <size>55</size>
    <total>55</total>
</responseDetails>
<data>
    <row>
        <id>131</id>
        <documentNumber>123</documentNumber>
        <version>131_1_0</version>
        <title__v>test</title__v>
        <document_business_unit__cr.name__v>
            <value>Global</value>
        </document_business_unit__cr.name__v>
    </row>
</data>
</Test>

您能帮我将上述输入的 XSLT 代码转换为所需的输出吗

【问题讨论】:

为此只需添加一个空模板以匹配 xsl 中的 data/row[contains(descendant::value, 'XYZ')] 【参考方案1】:

在这里你必须阻止所有带有文本'XYZ'的row节点。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="row[contains(descendant::value, 'XYZ')]"/>

</xsl:stylesheet>

【讨论】:

以上是关于使用 XSLT 过滤不包含节点的 XYZ的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 枚举同名节点

使用xslt和c#从中选择​​一个xml节点并根据其值添加更多节点[重复]

包含 ∈ 的 XML 文档无效 - 如何使用 XSLT 输出?

如何使用 xslt 从 xml 文档中过滤掉任意节点

用于将仅包含一个 <tr> 标记的 <table> 节点转换为仅 <div> 和 <span> 标记的 XSLT

XSLT 导出过滤器产生不必要的空 XML 标记