使用xslt检索先前标记中的信息

时间:2011-08-15 18:49:48

标签: xml xslt

我正在使用我需要转换为xslt的XML。

这是我的XML

<Groups>
            <term>
                <Tag1>My system1</Tag1>
                <Tag2>yes</Tag2>
                <Tag3>new york</Tag3>
            </term>
            <term>
                <Tag1/>
                <Tag2>no</Tag2>
                <Tag3>chicago</Tag3>
            </term>     
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>ok</Tag2>
                <Tag3>paris</Tag3>
            </term>
            <term>
                <Tag1/>
                <Tag2>help</Tag2>
                <Tag3>london</Tag3>
            </term>
            <term>
                <Tag1/>
                <Tag2>cancel</Tag2>
                <Tag3>rome</Tag3>
            </term>
</Groups>

这是我想要的输出。

<Groups>
            <term>
                <Tag1>My system1</Tag1>
                <Tag2>yes</Tag2>
                <Tag3>new york</Tag3>
            </term>
            <term>
                <Tag1>My system1</Tag1>
                <Tag2>no</Tag2>
                <Tag3>chicago</Tag3>
            </term>
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>ok</Tag2>
                <Tag3>paris</Tag3>
            </term>
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>help</Tag2>
                <Tag3>london</Tag3>
            </term>
            <term>
                <Tag1>My system2</Tag1>
                <Tag2>cancel</Tag2>
                <Tag3>rome</Tag3>
            </term>
</Groups>

所有xslt需要做的是用前面非空标签的值填充空标签。

我尝试使用变量,但显然它们在命令式语言中不像变量一样工作。

有关如何执行此操作的建议吗?

谢谢

2 个答案:

答案 0 :(得分:2)

这个简单的样式表应该这样做:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="*[not(text())]">
    <xsl:copy>
      <xsl:value-of select="../preceding-sibling::*[*[text() and name()=name(current())]][1]/*[text() and name()=name(current())]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

您始终可以使用“在前”轴搜索 包含值的相应标记,例如preceding::Tag1[text()] [1]。 (选择具有文本子项的第一个Tag1元素,第一个此类标记将是前一个非空标记,因为前一个轴的方向是反向文档顺序)。清除?