在xslt中建立依赖关系

时间:2011-02-14 13:53:17

标签: xslt

我在XSLT 1.0中建立没有冗余的依赖项时遇到问题。我有一个节点类型a和一个节点类型ba取决于b - 如果我遇到a,并且没有b已经存在,我应该插入一个。此外,我不应该在任何其他情况下改变任何事情。

输入:

<variables> 
    <var Value="a"/>
</variables>

输出:

<variables> 
    <var Value="a"/>
    <var Value="b"/>
</variables>

我遇到的困难是我不知道如何在同一模板中搜索ab。我可以搜索a,并将其替换为ab,但是当我们首先在那里时,我发现自己有冗余。我可以搜索ab,并用 a b 替换第一个实例,但如果我只有 b ,我将不包括 a 。我不知道如何搜索 a ,然后,如果找到它,搜索对等级节点b

1 个答案:

答案 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>

<强>解释

  1. 标识规则/模板“按原样”复制每个节点。使用和覆盖标识规则是最基本和最强大的XSLT设计模式。

  2. 只有一个模板 - 覆盖任何var元素的身份规则,其Value属性的值为"a"没有带var属性且值为Value的同级"b"元素。此模板复制其匹配元素,然后根据需要创建新的var元素。