2012-09-07 28 views
0

獲得元素的名稱,我有以下XML,我想只得到以「MBH」開始元素名稱:XSLT 1.0:使用EXSLT根據子

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

從我所看到的沒有任何複雜的事情你是必要的。它看起來更像是你在那裏挖洞。 – Tomalak

+0

你是對的,有時我只是想複雜 – Peter

回答

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">將是明智的。如果他們完全不同,他們不應該有相似的名字。
+0

你好Tomalak,謝謝你讓我走向正確的方向。我發現你的apply-templates只爲所找到的元素返回「true」。我將它改爲\t \t \t \t,它運作良好。 – Peter

+0

@彼得很高興我幫了忙,但我有一種直覺,認爲你還在做錯事。你爲什麼使用'node-set()'?你想達到什麼目的? – Tomalak

+0

不,不,現在看起來簡單多了:<?xml version =「1.0」encoding =「UTF-8」?> \t的 \t \t 的 \t \t \t的 \t \t ' – Peter