我想使用XSLT 1.0对xml进行xml转换。我需要从XML中删除完整节点,如果" Removeornot"价值不是" 1"。
我已经尝试过创建模板:
<xsl:template match="//Node[not(Grandchild0[not(Grand3child[not(Grand4child[not(Grand5child[not(Grand6child[not(Removeornot = 1)])])])])])]"/>
如果xml的级别较低,此模板可以正常工作,但我无法将其用于我的解决方案。所以也许有人可以帮忙。
源XML:
<?xml version="1.0" encoding="UTF-8"?>
<Family>
<Node>
<Child0>AAA</Child0>
<Child1>BBB</Child1>
<Child2>
<Grandchild0>
<Grand2child>DDD</Grand2child>
<Grand3child>
<Grand4child>
<Grand5child>
<Grand6child>
<Removeornot>1</Removeornot>
</Grand6child>
<Grand6child1>QQQ </Grand6child1>
</Grand5child>
<Grand5child1>ZZZ </Grand5child1>
</Grand4child>
</Grand3child>
<Grand2child2>EEE</Grand2child2>
</Grandchild0>
<Grandchild2>FFF</Grandchild2>
<Grandchild3>GGG</Grandchild3>
<Grandchild4>HHH</Grandchild4>
<Grandchild5>IIII</Grandchild5>
</Child2>
</Node>
<Node>
<Child0>AAA</Child0>
<Child1>BBB</Child1>
<Child2>
<Grandchild0>
<Grand2child>DDD</Grand2child>
<Grand3child>
<Grand4child>
<Grand5child>
<Grand6child>
<Removeornot>YES</Removeornot>
</Grand6child>
<Grand6child1>QQQ </Grand6child1>
</Grand5child>
<Grand5child1>ZZZ </Grand5child1>
</Grand4child>
</Grand3child>
<Grand2child2>EEE</Grand2child2>
</Grandchild0>
<Grandchild2>FFF</Grandchild2>
<Grandchild3>GGG</Grandchild3>
<Grandchild4>HHH</Grandchild4>
<Grandchild5>IIII</Grandchild5>
</Child2>
</Node>
<Node>
<Child0>AAA</Child0>
<Child1>BBB</Child1>
<Child2>
<Grandchild0>
<Grand2child>DDD</Grand2child>
<Grand3child>
<Grand4child>
<Grand5child>
<Grand6child>
<Removeornot>NO</Removeornot>
</Grand6child>
<Grand6child1>QQQ </Grand6child1>
</Grand5child>
<Grand5child1>ZZZ </Grand5child1>
</Grand4child>
</Grand3child>
<Grand2child2>EEE</Grand2child2>
</Grandchild0>
<Grandchild2>FFF</Grandchild2>
<Grandchild3>GGG</Grandchild3>
<Grandchild4>HHH</Grandchild4>
<Grandchild5>IIII</Grandchild5>
</Child2>
</Node>
</Family>
这个XSLT只是打印&#34; Removeornot&#34;值。完成此任务的其他方法是将此值用作变量,但据我所知,XSLT中的变量是完全不可变的,我不能在for-each循环外使用它们。如果值内容错误,我怎么能用这个值来删除节点?
XSLT来源:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="v2">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="Family/Node">
<xsl:call-template name="tests"></xsl:call-template>
<!-- Is it possible to get variable value here to understand if node shloud be deleted?
<xsl:if test="$tester = 1">
<xsl:call-template name="copyit"></xsl:call-template>
</xsl:if> -->
</xsl:for-each>
</xsl:template>
<xsl:template name="tests">
<!-- <xsl:for-each select="Family/Node"> -->
<xsl:for-each select="Child2/Grandchild0">
<xsl:for-each select="Grand3child/Grand4child">
<xsl:for-each select="Grand5child/Grand6child">
<xsl:value-of select="Removeornot"></xsl:value-of>
<!-- <xsl:variable name="tester" select="Removeornot" ></xsl:variable>-->
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
<!-- </xsl:for-each> -->
</xsl:template>
<xsl:template name="copyit">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<Family>
<Node>
<Child0>AAA</Child0>
<Child1>BBB</Child1>
<Child2>
<Grandchild0>
<Grand2child>DDD</Grand2child>
<Grand3child>
<Grand4child>
<Grand5child>
<Grand6child>
<Removeornot>1</Removeornot>
</Grand6child>
<Grand6child1>QQQ </Grand6child1>
</Grand5child>
<Grand5child1>ZZZ </Grand5child1>
</Grand4child>
</Grand3child>
<Grand2child2>EEE</Grand2child2>
</Grandchild0>
<Grandchild2>FFF</Grandchild2>
<Grandchild3>GGG</Grandchild3>
<Grandchild4>HHH</Grandchild4>
<Grandchild5>IIII</Grandchild5>
</Child2>
</Node>
</Family>
我也是新的XSLT,感谢每一个帮助。
答案 0 :(得分:1)
如果“Removeornot”值不是“1”,我需要从XML中删除完整节点。
那将是
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Node[not(.//Removeornot = 1)]" />
</xsl:transform>
Node[not(.//Removeornot = 1)]
的另一个模板更具体 - 它不会为此处匹配的任何节点输出任何内容,这实际上会从输入中删除这些节点。