我想将模板应用于具有指定属性的子节点的节点,我很好奇是否可以使用<template match=...
所以,如果我有一个输入xml
<?xml version="1.0"?>
<parent-node>
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<child-node>
<label>value2</label>
<desc>description2</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
</parent-node>
所需的模板将应用于已定义desc
属性的src
子节点的节点,例如。第一个和最后一个节点:
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
我到目前为止最好的是匹配具有desc
个子节点的节点的模板,其余的(测试desc
个节点中是否有@src
个节点都在模板内) ,在xsl:choose
条款中:
<xsl:template match="*[desc]">
<xsl:choose>
<xsl:when test="desc[@src]">
<xsl:element name="node-with-src">
[...]
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="node">
[...]
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
通过拥有这样一个模板,我可以离开otherwise
部分在这个模板中,无论如何,它会更好。
提前感谢您的每一个答案!
修改 我更喜欢1.0解决方案,但这不是一个标准。
答案 0 :(得分:5)
允许使用更复杂(嵌套)的谓词。使用此:
<xsl:template match="*[desc[@src]]">
没有src
属性的节点的相应模板:
<xsl:template match="*[desc[not(@src)]]">
例如:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*[desc[@src]]">
<xsl:element name="node-with-src"/>
</xsl:template>
<xsl:template match="*[desc[not(@src)]]">
<xsl:element name="node"/>
</xsl:template>
</xsl:stylesheet>
适用于:
<parent-node>
<child-node>
<label>value1</label>
<name>name1</name>
<desc src="anything">description1</desc>
</child-node>
<child-node>
<label>value2</label>
<desc>description2</desc>
</child-node>
<some-node>
<name>name3</name>
<desc src="something">description3</desc>
</some-node>
</parent-node>
输出:
<node-with-src/>
<node/>
<node-with-src/>