我想将模板应用于具有指定属性的子节点的节点,我很好奇是否可以使用 <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>
Run Code Online (Sandbox Code Playgroud)
所需的模板将应用于具有已定义属性的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>
Run Code Online (Sandbox Code Playgroud)
我迄今为止最好的是符合具有节点模板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>
Run Code Online (Sandbox Code Playgroud)
通过拥有这样一个模板,我可以离开otherwise这个模板中的部分,无论如何,它会更好.
提前感谢您的每一个答案!
编辑 我更喜欢1.0解决方案,但它不是一个标准.
允许更复杂(嵌套)的谓词.用这个:
<xsl:template match="*[desc[@src]]">
Run Code Online (Sandbox Code Playgroud)
以及没有src属性的节点的相应模板:
<xsl:template match="*[desc[not(@src)]]">
Run Code Online (Sandbox Code Playgroud)
例如:
<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>
Run Code Online (Sandbox Code Playgroud)
应用于:
<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>
Run Code Online (Sandbox Code Playgroud)
输出:
<node-with-src/>
<node/>
<node-with-src/>
Run Code Online (Sandbox Code Playgroud)