我正在尝试使用XSLT 1.0编写一个xml转换,这是全新的,所以在运行中选择它,我的问题是: 如果我为每个循环都有一个这样的
<xsl:for-each select="ns0:BxfMessage/ns0:BxfData/ns0:Content" >
<xsl:if test="string(@version) = 'Series'">
if语句用于检查嵌入在标记中的字符串,如下所示:
<Content version="Series" action="update">
现在我的问题是我需要为每个循环中的每个循环内部的每个循环,但它需要查看相同的级别(ns0:BxfMessage / ns0:BxfData / ns0:内容),如果我为每个循环创建另一个以此作为选择它将在
ns0:BxfMessage/ns0:BxfData/ns0:Content/ns0:BxfMessage/ns0:BxfData/ns0:Content
这没有帮助。我需要查看相同的级别并使用不同的if语句来读取该版本字符串。这是因为我需要一个使用子节点来构建树的输出。不幸的是我无法改变输入xml,它将系列,标题和版本排在同一级别,我需要强制它们进行结构化
干杯
答案 0 :(得分:0)
你说不幸的是我无法更改输入xml ,但这是XSLT ...当然你可以在处理它之前更改它。但你不需要。
XSL在您当前的模板中具有“上下文节点”的概念,因此您应该能够选择
select="../ns0:Content/..."
但是你也可以直接选择它们(在原始选择中):
select="ns0:BxfMessage/ns0:BxfData/ns0:Content[@version='Series']"
或相对:
select="../ns0:Content[@version='Series']"
如果您需要,只需为每个模板提供不同的模板。
对我而言,您似乎想要选择这些元素ns0:BxfData
的父级,并使用相对于上下文选择器来写出树而不是列表。那么您可能根本不需要for-each
。
<xsl:template match="ns0:BxfMessage/ns0:BxfData">
<xsl:element name="Rank">
<xsl:element name="Series>
<xsl:copy-of select="./ns0:Content[@version='Series']/@action" />
</xsl:element>
<xsl:element name="Title">
<xsl:copy-of select="./ns0:Content[@version='Title']/@action" />
</xsl:element>
<xsl:element name="Version">
<xsl:copy-of select="./ns0:Content[@version='Version']/@action" />
</xsl:element>
</xsl:element>
</xsl:template>
应该发出如下所示的新XML:
<Rank>
<Series action="update" />
<Title action="..." />
<Version action="..." />
</Rank>
我的语法略有偏差(自从我完成任何转换以来已经有一段时间了),但这个想法应该是明确的。此模板与通用模板相结合,可以复制您希望保留的所有节点,而不需要循环。