XSLT:使用来自祖先兄弟节点的数据应用模板

时间:2015-03-11 17:47:03

标签: xml xslt xpath

我是 XPath XSLT 的新手,我正在使用XSLT将XML文档转换为另一个XML文档。

以下代码显示了源文档的一部分:

<aggregateRoot>
   <orderRequest someAttribute="stuff">
       <!--more nodes-->
   </orderRequest>
   <order>
      <item>
        <template>
          <node>
             <image/>
          </node>
        </template>
      </item>
    </order>
<aggregateRoot>

这是我的XSLT的样子:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <!--A bunch of stuff that works already-->   
   <Orders>
      <xsl:for-each select="aggregateRoot/order">
         <!--More Nodes-->
         <xsl:for-each select="item/template">
             <Jobs>
                 <xsl:apply-templates select="//agregateRoot/orderRequest"/>   <!--PROBLEM AREA-->
             </Jobs>
         </xsl:for-each>
      </xsl:for-each>
   </Orders>
<xsl:template/>

<xsl:template match="aggregateRoot/orderRequest">
   <!--Grab data from orderRequest and its children-->
</xsl:template>

问题描述:

在上面的XSLT中,当我在<Jobs>节点内时,我正在尝试应用基于<orderRequest>节点的模板,<order>节点是<aggregateRoot>的兄弟节点节点和主select节点的子节点。

我尝试了几十种组合来更改match<orderRequest>语句的结构,但我无法访问{{1}}节点,甚至无法获取第二个模板火。

1 个答案:

答案 0 :(得分:2)

我发现你的XSLT有两个问题,还有两个小问题:

  • 形成不正确(您的样本输入也不是)
  • 你拼错了“聚合”
  • 您使用双斜线,只需要一个
  • 您过度使用for-each而不是模板

修复前两个问题后,XSLT就可以运行了。这里修复了所有4个问题:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <Orders>
      <xsl:apply-templates select="aggregateRoot/order" />
    </Orders>
  </xsl:template>

  <xsl:template match="order">
    <xsl:apply-templates select="item/template" />
  </xsl:template>

  <xsl:template match="template">
    <Jobs>
      <xsl:apply-templates select="/aggregateRoot/orderRequest"/>
    </Jobs>
  </xsl:template>

  <xsl:template match="orderRequest">
    <xsl:value-of select="@someAttribute" />
  </xsl:template>
</xsl:stylesheet>

这会产生输出:

<Orders>
  <Jobs>stuff</Jobs>
</Orders>