我在XSLT 1.0中建立没有冗余的依赖项时遇到问题。我有一个节点类型a
和一个节点类型b
。 a
取决于b
- 如果我遇到a
,并且没有b
已经存在,我应该插入一个。此外,我不应该在任何其他情况下改变任何事情。
输入:
<variables>
<var Value="a"/>
</variables>
输出:
<variables>
<var Value="a"/>
<var Value="b"/>
</variables>
我遇到的困难是我不知道如何在同一模板中搜索a
和b
。我可以搜索a
,并将其替换为a
和b
,但是当我们首先在那里时,我发现自己有冗余。我可以搜索a
或b
,并用 a 和 b 替换第一个实例,但如果我只有 b ,我将不包括 a 。我不知道如何搜索 a ,然后,如果找到它,搜索对等级节点b
。
答案 0 :(得分:4)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"var[@Value='a' and not(../var[@Value='b'])]">
<xsl:call-template name="identity"/>
<var Value="b"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档:
<variables>
<var Value="a"/>
</variables>
会产生想要的正确结果:
<variables>
<var Value="a"/>
<var Value="b"/>
</variables>
<强>解释强>:
标识规则/模板“按原样”复制每个节点。使用和覆盖标识规则是最基本和最强大的XSLT设计模式。
只有一个模板 - 覆盖任何var
元素的身份规则,其Value
属性的值为"a"
没有带var
属性且值为Value
的同级"b"
元素。此模板复制其匹配元素,然后根据需要创建新的var
元素。