xsl:仅将模板应用于具有特定属性值的节点
我有一个 XML 文档,需要对其进行 XSLT 处理。结构类似于:
<root>
<item value="1">
<object/>
</item>
<item value="2" />
<object/>
</item>
</root>
我的目标是最终得到类似于以下内容的转换后的 XML:
<root>
<parent>
<object-one value-one="1"/>
</parent>
<parent>
<object-two value-two="2"/>
</parent>
</root>
我的 XSLT 类似于:
<xsl:apply-templates select="object" />
<xsl:template match="object">
<xsl:call-template name="1" />
<xsl:call-template name="2" />
</xsl:template>
<xsl:template name="1" match="object[item/@value = '1'">
<xsl:element name="object-one" namespace="http://something.org">
<xsl:attribute name="_Description">
<xsl:value-of select="@_Type"/>
</xsl:attribute>
<xsl:attribute name="_Type">
<xsl:value-of select="@_Amount"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template name="2" match="object[item/@value = '2'">
<xsl:element name="object-two" namespace="http://something.org">
<xsl:attribute name="OriginalAmount">
<xsl:value-of select="@_Amount"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
问题是所有项目节点都应用了相同的模板。如何将模板仅应用于特定节点?
I have an XML document which I'm subjected to an XSLT. The structure is similar to:
<root>
<item value="1">
<object/>
</item>
<item value="2" />
<object/>
</item>
</root>
My goal is to end up with a transformed XML similar to:
<root>
<parent>
<object-one value-one="1"/>
</parent>
<parent>
<object-two value-two="2"/>
</parent>
</root>
My XSLT is similar to:
<xsl:apply-templates select="object" />
<xsl:template match="object">
<xsl:call-template name="1" />
<xsl:call-template name="2" />
</xsl:template>
<xsl:template name="1" match="object[item/@value = '1'">
<xsl:element name="object-one" namespace="http://something.org">
<xsl:attribute name="_Description">
<xsl:value-of select="@_Type"/>
</xsl:attribute>
<xsl:attribute name="_Type">
<xsl:value-of select="@_Amount"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template name="2" match="object[item/@value = '2'">
<xsl:element name="object-two" namespace="http://something.org">
<xsl:attribute name="OriginalAmount">
<xsl:value-of select="@_Amount"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
The problem is the all item nodes are having the same template applied. How can I apply a template to only specific nodes?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
编辑:现在对于不同的输入示例(已更正为格式正确):
此样式表:
输出:
编辑2:现在,您的样式表片段中有什么问题?好吧,看来您不知道处理器如何解析模板规则应用以及 XPath 导航。
首先,此
object[item/@value = '1']
将仅匹配此类输入其次,考虑这三个规则
1 -
2 -
3 -
使用最后提供的输入,首先
object
元素(按文档顺序)将匹配规则 1 和 2,然后处理器将决定应用规则 2。为什么?来自http://www.w3.org/TR/xslt#conflictEDIT: Now for different input sample (corrected for well-formed):
This stylesheet:
Output:
EDIT 2: Now, what is wrong within your stylesheet fragment? Well, it looks like you don't know how the processor resolves template rules applying, also XPath navegation.
First, this
object[item/@value = '1']
will match only this kind of inputSecond, consider this three rules
1 -
2 -
3 -
With your last provided input, first
object
element (in document order) will match rules 1 and 2, and then the processor would resolve to apply rule 2. Why? From http://www.w3.org/TR/xslt#conflict也许你可以让你的匹配更具体:
Perhaps you can make your matches more specific: