我想将模板应用于具有指定属性的子节点,我很好奇是否可以使用<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解决方案,但它不是标准。
发布于 2011-04-20 18:56:06
允许使用更复杂的(嵌套)谓词。用这个:
<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/>https://stackoverflow.com/questions/5735138
复制相似问题