我希望能够对具有指定属性的子节点应用模板,我很好奇是否可以使用 <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>
只有在具有 src
属性定义的 desc
子元素的节点上应用所需的模板,例如第一个和最后一个节点:
<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解决方案,但这不是一个标准。
<xsl:template match="* [desc [not(@ src)]]">
部分,我因为它而发疯,而且我无法准确表达问题! - rekaszeru