我正在尝试使用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>
答案 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>
对我而言,这似乎比乔尔的解决方案更清晰。