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

时间:2011-04-20 18:48:42

标签: xslt xpath

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

1 个答案:

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