XSLT浏览标记级别

时间:2013-10-01 15:45:11

标签: xml xslt

我正在尝试使用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,它将系列,标题和版本排在同一级别,我需要强制它们进行结构化

干杯

1 个答案:

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

我的语法略有偏差(自从我完成任何转换以来已经有一段时间了),但这个想法应该是明确的。此模板与通用模板相结合,可以复制您希望保留的所有节点,而不需要循环。