xsl模板匹配xpath中的OR条件不起作用

时间:2017-11-23 10:12:03

标签: xml xslt xpath xslt-1.0

我正在尝试编写一个xsl,它将返回element的xpaths及其直接子节点

示例XML

<level0>
    <level1>
        <level2>
            <level3>
                <level4/>
            </level3>
            <level3/>
        </level2>
    </level1>
</level0>

例如,如果我想返回level2的xpath,那么它应该返回

/level0/level1/level2
/level0/level1/level2/level3
/level0/level1/level2/level3

我的XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output method="text" media-type="text/plain"/>
    <xsl:template match="@*|comment()|text()|processing-instruction()"/>
     <xsl:template match="//level2|//level2/*">
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="concat('/',name(.))"/>
        </xsl:for-each>
        <xsl:text>&#xA;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

在这个xsl中,我试图匹配//level2|//level2/* xpath的模板(它应返回所需的结果)。但是,我只是

/level0/level1/level2

如何获得所需的结果?

1 个答案:

答案 0 :(得分:2)

只需在<xsl:apply-templates/>

之后添加<xsl:text>&#xA;</xsl:text>即可
<xsl:template match="//level2|//level2/*">
    <xsl:for-each select="ancestor-or-self::*">
        <xsl:value-of select="concat('/',name(.))"/>
    </xsl:for-each>
    <xsl:text>&#xA;</xsl:text>
    <xsl:apply-templates/>
</xsl:template>

<强>输出

/level0/level1/level2
/level0/level1/level2/level3
/level0/level1/level2/level3