我有以下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,但我不明白为什么会出现这个错误。
感谢您的帮助, 彼得
答案 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">
” )。