将模板应用于具有属性子节点的节点

3

我希望能够对具有指定属性的子节点应用模板,我很好奇是否可以使用 <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解决方案,但这不是一个标准。
1个回答

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/>

1
太棒了!非常感谢,尤其是这个<xsl:template match="* [desc [not(@ src)]]">部分,我因为它而发疯,而且我无法准确表达问题! - rekaszeru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接