2011-05-16 55 views
2

我有一個XML模式,我需要從中提取值,但我沒有多少運氣。XSLT foreach重複節點到平坦

的烴源模式是:

<Reading> 
    <State> 
     <StateValues> 
     <Name> 
     <Value> 
     </StateValues> 
    </State> 
<Reading> 

的XML的一個例子是:

<Reading> 
    <State> 
     <StateValues> 
     <Name>Reading1</Name> 
     <Value>1234</Value> 
     </StateValues> 
     <StateValues> 
     <Name>Reading2</Name> 
     <Value>2345</Value> 
     </StateValues> 
    </State> 
    <State> 
     <StateValues> 
     <Name>Reading3</Name> 
     <Value>4321</Value> 
     </StateValues> 
    </State> 
<Reading> 

我需要的結果是:

<Readings> 
    <Reading1>1234</Reading1> 
    <Reading2>2345</Reading2> 
    <Reading3>4321</Reading3> 
</Readings> 

我沒有控制權模式。

我一直在嘗試使用xsl:foreachxsl:if,檢查名稱,但我只是得到第一個值重複3次。有小費嗎?我一直在試圖找出這2天,我不是XSLT專家...

謝謝。編輯:對不起,我的XSLT沒有公佈。我曾嘗試過幾個版本,並不認爲它會有用。那就是:

塊引用

<xsl:element name="ns0:Readings"> 
    <xsl:element name="ns0:Current"> 
     <xsl:for-each select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']">    
      <xsl:choose> 
       <xsl:when test="Name='TOTAL'"> 
      <xsl:element name="ns0:Total"> 
       <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()='Total'" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()='Reading1'"> 
     <xsl:element name="ns0:Reading1"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text() = 'Reading2'"> 
     <xsl:element name="ns0:Reading2"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text() = 'Reading3'"> 
     <xsl:element name="ns0:Reading3"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text() = 'Reading4'"> 
     <xsl:element name="ns0:Reading4"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:element> 
</xsl:element> 
+0

什麼是你想使用XSLT? – Richard 2011-05-16 08:43:06

+0

您誤解了有關規範的內容。如果你向我們展示了你的代碼,我們可以告訴你哪裏出錯了,這比僅僅給你一個解決方案更有用。 – 2011-05-16 09:08:47

+0

我低估了你的問題。如果您嘗試了某種方法並且失敗了,您應該告訴我們您嘗試過的以及失敗的方式。 – 2011-05-16 09:09:31

回答

5

foreachif通常在XSLT錯誤的做法。將模板應用於模式要有效得多。在這種情況下,你可以使用兩個:第一個建立根元素,匹配您要使用的元素:

<xsl:template match='/'> 
    <Readings> 
    <xsl:apply-templates select='Reading/State/StateValues'/> 
    </Readings> 
</xsl:template> 

和第二,上面的觸發器,當找到匹配,會做的核心工作。複雜性在這裏是動態創建元素這意味着使用{XPath}語法來從輸入文檔名稱:

<xsl:template match='StateValues'> 
    <xsl:element name='{Name}'> 
    <xsl:value-of select='Value' /> 
    </xsl:element> 
</xsl:template> 
+0

+1 {Name} - 我需要將根匹配更改爲 StuartLC 2011-05-16 12:50:47

+0

@nonnb:更正了XPath ... – Richard 2011-05-18 09:17:41

+0

感謝您的回答。我已經習慣瞭解更多這方面的知識並使其工作。非常感激你的幫助。 – Tycho 2011-05-19 11:19:43