【问题标题】:XSLT 1.0: using EXSLT to get element name according to substringXSLT 1.0:使用 EXSLT 根据子字符串获取元素名称
【发布时间】:2012-09-07 07:08:48
【问题描述】:

我有以下 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,但我不明白为什么会出现该错误。

【问题讨论】:

  • 据我所知,您所做的任何复杂的事情都是不必要的。看起来更像是在自掘坟墓。
  • 你说得对,有时候我只是想复杂

标签: xslt exslt


【解决方案1】:

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

怎么了

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

?

几点说明:

  • 尽可能使用name() 而不是local-name()。您的输入中没有命名空间,因此它们之间没有任何区别。
  • child:: 轴是默认值。 child::* 等价于 *
  • 如果您可以对此做任何事情,请更改输入。拥有&lt;xyz1&gt;&lt;xyz3&gt; 并不是很聪明,除非&lt;xyz3&gt; 实际上与&lt;xyz1&gt; 完全不同(而不仅仅是“第三个&lt;xyz&gt;)。
    在那种情况下,&lt;xyz num="1"&gt; 将是明智的。如果它们完全不同,则不应具有相似的名称。

【讨论】:

  • 您好 Tomalak,感谢您让我进入正确的方向。我发现您的应用模板只为找到的元素返回“true”。我把它改成了
  • @Peter 很高兴我提供了帮助,但我有一种直觉,你仍然做错了。你为什么要使用node-set()?你想达到什么目的?
  • 不,不,现在看起来简单多了:&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt; &lt;xsl:template match="text()"/&gt; &lt;xsl:template match="//record/*[starts-with(name(), 'MBH')]"&gt; &lt;xsl:value-of select="name()"/&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt;
  • 它只给了我一个 3 MBH... 元素的字符串,但这很好。
  • @Peter:啊,我明白了。是的,看起来还不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多