XSLT转换:搜索节点,并返回分层双亲(XSLT Transformation: Search no

2019-10-16 13:14发布

希望这还没有被问过,但我有以下XML:

<Company id="1000" name="Company1000">
   <Company id="1020" name="Company1020" />
   <Company id="1004" name="Company1004">
      <Company id="1005" name="Company1005" />
   </Company>
   <Company id="1022" name="Company1022" />
</Company>

我有以下XPath来搜索节点: //*[contains(translate(@name, "ABCDEFGHJIKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz"), "005")]

我想这回:

<Company id="1000" name="Company1000">
   <Company id="1004" name="Company1004">
      <Company id="1005" name="Company1005" />
   </Company>
</Company>

因此,这将Company1005节点,其各自所有的父母相匹配。 我想,如果我在寻找“100”,在这种情况下,将依次对每个元素匹配上面也被退回,但我显然不希望节点的复制。

我一直在努力与这个现在小时,所以你的帮助将非常感激!

谢谢。

Answer 1:

解决的办法是复制符合您的要求(包括你想要的字符串)只后代或自节点。

在这个底部看这幅画页的XPath轴需要。

龙版本:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<xsl:strip-space elements="*"/>

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

<!-- just copy Company which descendant-or-self contain the matching string -->
<xsl:template match="Company">
    <xsl:if test="descendant-or-self::Company[contains(translate(@name, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '005')]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

简洁版本:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="UTF-8" indent="yes"/>

<xsl:strip-space elements="*"/>

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

<!-- do not copy Company which do not have a descendant-or-self matching string -->
<xsl:template match="Company[not(descendant-or-self::Company[contains(translate(@name, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '005')])]"/>

</xsl:stylesheet>

你的XML输出:

<?xml version="1.0" encoding="UTF-8"?>
<Company id="1000" name="Company1000">
  <Company id="1004" name="Company1004">
    <Company id="1005" name="Company1005"/>
  </Company>
</Company>


文章来源: XSLT Transformation: Search nodes, and return hierarchical parents