2010-06-30 40 views
1

我的系統生成一個XML,其中包含一個節點,該節點根據事件的類型具有不同的名稱。 名稱可以是<floatRate><fixedRate>。路徑始終相同,只有不同的節點名稱。如何根據使用XLST的某個節點的存在使節點結果不同?

我需要一個轉換,可以根據該名稱填充一個字段。該字段將被稱爲<type>,並且競爭必須基於節點名稱浮動或固定。 可以這樣做嗎?

+0

好問題(+1)。請參閱我的答案,瞭解遵循XSLT精神的完整解決方案。 – 2010-07-01 01:10:29

回答

1

該轉化

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="fixedRate|floatRate"> 
    <type><xsl:value-of select= 
      "substring-before(name(),'Rate')"/></type> 
</xsl:template> 
</xsl:stylesheet> 

當此XML文檔上施加:

<rates> 
    <fixedRate>2.3</fixedRate> 
    <floatRate>1.1</floatRate> 
</rates> 

產生想要的結果

<rates> 
    <type>fixed</type> 
    <type>float</type> 
</rates> 
+0

我相信我會用這樣的東西。坦克再次Dimitre。 – 2010-07-01 14:19:33

0

選擇/馬赫表達式可以做布爾「或」,如

match="floatRate|fixedRate" 

編輯你的問題,增加輸入的樣本,預期產出和你已經嘗試過以獲得更多的幫助

+0

這不是「布爾值」或「這是XPath聯合運算符」。 – 2010-07-01 01:03:12

+0

我沒有意識到select/mach表達式可以做布爾(或聯合)。更多的是,這是做我所需要的最簡單的方法。 坦克的幫助。有了這個和另一個例子,我相信我找到了一個可行的解決方案。 – 2010-07-01 14:18:00

0

假設我們有這個文件作爲輸入:

<result> 
    <floatRate>1.1</floatRate> 
</result> 

這個樣式表:

<xsl:stylesheet 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      version="1.0"> 
    <xsl:template match="result"> 
     <type> 
     <xsl:value-of select="substring-before(name(floatRate|fixedRate),'Rate')"/> 
     </type> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

輸出:

<type>float</type> 
+0

我不需要表達式。它是爲了什麼? – 2010-07-01 14:20:43

+0

@Daniel Corsi:該模板覆蓋文本節點的內置模板(僅輸出其值)。在這種情況下,並不是必須的:'result'模板在到達'floatRate'的文本節點之前中斷遞歸。 – 2010-07-01 15:59:49

相關問題