我是 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}}节点,甚至无法获取第二个模板火。
答案 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>