XSLT 1.0:使用EXSLT根据子字符串获取元素名称

时间:2012-09-07 07:08:49

标签: xslt exslt

我有以下XML,我只想获得以“MBH”开头的元素名称:

<?xml version="1.0" encoding="UTF-8"?>
<GenericRecs>
<GenericRecord>
    <record>
        <MBH1/>
    </record>
    <record>
        <BAL1/>
    </record>
    <record>
        <MBH2/>
    </record>
    <record>
        <BAL2/>
    </record>
    <record>
        <PAY2/>
    </record>
    <record>
        <MBH3/>
    </record>
    <record>
        <BAL3/>
    </record>
    <record>
        <PAY3/>
    </record>
</GenericRecord>
</GenericRecs>

我有以下XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common"
version="1.0">

<xsl:variable name="x" select="ext:node-set(substring(local-name(//record/child::*),1,3)='MBH')"/>

<xsl:variable name="mbh">
    <xsl:for-each select="$x">
            <item>
                <xsl:copy>
                    <xsl:value-of select="local-name(.)"/>
                </xsl:copy> 
            </item>
    </xsl:for-each>
</xsl:variable>

<xsl:template match="/">
    <xsl:apply-templates select="$mbh"/>
</xsl:template>
</xsl:stylesheet>

但我得到的只是一个错误“描述:无法将#RTREEFRAG转换为NodeList!” 我正在使用EXSLT,但我不明白为什么会出现这个错误。

感谢您的帮助, 彼得

1 个答案:

答案 0 :(得分:1)

  

我有以下XML,我只想获得以“MBH”开头的元素名称:

有什么问题
<xsl:apply-templates select="//record/*[starts-with(name(), 'MBH')]" />

一些注意事项:

  • 尽可能使用name()而不是local-name()。您的输入中没有名称空间,因此它们之间没有任何区别。
  • child::轴是默认值。 child::*相当于*
  • 如果您可以执行任何操作,请更改输入。 <xyz1><xyz3> <xyz3>并不是很聪明,除非<xyz1>实际上与<xyz>完全不同(而不仅仅是“第三个<xyz num="1">)。
    在那种情况下{{1}}是明智的。如果它们完全不同,则不应该有相似的名称。