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

rek*_*eru 3 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>
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解决方案,但它不是一个标准.

Way*_*ett 5

允许更复杂(嵌套)的谓词.用这个:

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