1

我正在尝试使用 XSLT 1.0 编写一个 xml 转换,这对它来说是全新的,所以我的问题是:如果我有一个 for each 循环,这样

<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:Content),如果我为每个循环创建了另一个循环,则为它将寻找的选择

 ns0:BxfMessage/ns0:BxfData/ns0:Content/ns0:BxfMessage/ns0:BxfData/ns0:Content 

这没有帮助。我需要查看同一级别并使用不同的 if 语句来读取该版本字符串。这是因为我需要一个使用孩子来构建树的输出。不幸的是,我无法更改输入 xml,它将系列、标题和版本都排在同一级别,我需要强制它们结构化

干杯

4

1 回答 1

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>

我的语法可能略有偏差(自从我进行任何转换以来已经有一段时间了),但这个想法应该很清楚。该模板与通用模板相结合,可以复制您默认保留的所有节点,无需任何循环即可工作。

于 2013-10-01T16:10:38.343 回答