我正在使用我需要转换为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需要做的是用前面非空标签的值填充空标签。
我尝试使用变量,但显然它们在命令式语言中不像变量一样工作。
有关如何执行此操作的建议吗?
谢谢
答案 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元素,第一个此类标记将是前一个非空标记,因为前一个轴的方向是反向文档顺序)。清除?