如何使用XSLT过滤XML节点内的元素?

时间:2018-01-12 02:38:22

标签: java xml xslt

我正在尝试使用XSLT转换XML,但需要避免转换特定节点内的元素。我怎样才能做到这一点?

我当前的XSLT修改了所有节点。下面是我的XML,我需要避免转换<Makers>节点中的所有元素:

<Data>
       <Makers>
            <Type>ABC</Type>
            </Set>
            <Block>
                <FirstName>ZSPZCVCR</FirstName>
                <LastName/>
            </Block>
        </Makers>
        <Keeper>
            <Code>12</Node>
            <Name>Division</Name>
            <Number/>
            <Company/>
        </Keeper>
</Data>

以下是我的XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
      </xsl:template>      
    <xsl:template match="*[not(*)][not(normalize-space())]">
      <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:text>12345</xsl:text>
      </xsl:copy>
    </xsl:template>
   </xsl:stylesheet>

请提供任何解决方案或建议修改现有XSLT的方法,以避免修改<Makers>的所有元素。

所需的输出应如下所示,其中<Makers>内的任何空节点未被修改,但在所有空节点被修改为值“12345”之外:

<Data>
       <Makers>
            <Type>ABC</Type>
            </Set>
            <Block>
                <FirstName>ZSPZCVCR</FirstName>
                <LastName/>
            </Block>
        </Makers>
        <Keeper>
            <Code>12</Node>
            <Name>Division</Name>
            <Number>12345</Number>
            <Company>12345</Company>
        </Keeper>
</Data>

2 个答案:

答案 0 :(得分:1)

你应该添加一个谓词:

[not(ancestor::Makers)]

到你的第二个模板。如

<xsl:template match="*[not(*)][not(normalize-space())][not(ancestor::Makers)]">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:text>12345</xsl:text>
    </xsl:copy>
</xsl:template>

答案 1 :(得分:0)

我的解决方案是添加模板规则

<xsl:template match="Makers" priority="5">
  <xsl:copy-of select="."/>
</xsl:template>

对我而言,这似乎比乔尔的解决方案更清晰。