2012-05-22 119 views
2

我在使用網絡設備中的XSLT轉換某些XML數據時遇到了問題。考慮以下xml輸出...使用XSLT對名稱空間的XML元素進行迭代

<rpc-reply xmlns:junos="http://xml.juniper.net/junos/11.4X27/junos"> 
    <multi-routing-engine-results> 
     <multi-routing-engine-item> 
      <re-name>member0</re-name> 
      <environment-information 
       xmlns="http://xml.juniper.net/junos/11.4X27/junos-chassis"> 
       <environment-item> 
        <name>PEM 0</name> 
        <class>Temp</class> 
        <status>OK</status> 
        <temperature junos:celsius="30">30 degrees C/86 degrees F 
        </temperature> 
       </environment-item> 
       <environment-item> 
        <name>PEM 1</name> 
        <class>Temp</class> 
        <status>OK</status> 
        <temperature junos:celsius="30">30 degrees C/86 degrees F 
        </temperature> 
       </environment-item> 
      </environment-information> 
     </multi-routing-engine-item> 
     <multi-routing-engine-item> 
      <re-name>member1</re-name> 
      <environment-information 
       xmlns="http://xml.juniper.net/junos/11.4X27/junos-chassis"> 
       <environment-item> 
        <name>PEM 0</name> 
        <class>Temp</class> 
        <status>OK</status> 
        <temperature junos:celsius="25">25 degrees C/77 degrees F 
        </temperature> 
       </environment-item> 
       <environment-item> 
        <name>PEM 1</name> 
        <class>Temp</class> 
        <status>OK</status> 
        <temperature junos:celsius="25">25 degrees C/77 degrees F 
        </temperature> 
       </environment-item> 
      </environment-information> 
     </multi-routing-engine-item> 
    </multi-routing-engine-results> 
    <cli> 
     <banner>{master:member0-re0}</banner> 
    </cli> 
</rpc-reply> 

如何迭代XSLT中的每個「環境項目」元素。我有一些像目前是以下....

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:for-each select="rpc-reply/multi-routing-engine-results/multi-routing-engine-item"> 
       ... 
       <xsl:for-each select="./environment-information/environment-item"> 
       ..... 
       </xsl:for-each> 
      </block> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

然而,當它到達第二循環<xsl:for-each select="./environment-information/environment-item">我的代碼不能正常工作。 我懷疑它也是<environment-information xmlns="http://xml.juniper.net/junos/11.4X27/junos-chassis">元素。

是否有一些特殊的語法我應該使用?

+1

問題在哪裏?你能否擴展你的問題來描述出了什麼問題? – topskip

回答

2

問題在於命名空間。 environment-informationenvironment-item位於「http://xml.juniper.net/junos/11.4X27/junos-chassis」命名空間中。這工作:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="http://xml.juniper.net/junos/11.4X27/junos-chassis"> 
    <xsl:template match="/" > 
    <root> 
    <xsl:for-each select="rpc-reply/multi-routing-engine-results/multi-routing-engine-item"> 
     <xsl:for-each select="a:environment-information/a:environment-item"> 
     <whatever></whatever> 
     </xsl:for-each> 
    </xsl:for-each> 
    </root> 
    </xsl:template> 
</xsl:stylesheet> 

你並不需要「./」在內部循環的正面爲重點是元素multi-routing-engine-itemenvironment-information可選擇由剛剛命名該項目上(當然,照顧命名空間,當然)。

+0

非常感謝您的幫助,它的工作。 – user1409404

+1

@ user1409404我想你知道通過點擊答案左側的箭頭來「接受」(也是upvoting)一個答案,你會發現這個解決方案對你有用(它讓我很開心)。 – topskip

+0

有沒有一種方法可以忽略名稱空間「xmlns:junos = http://xml.juniper.net/junos/11.4X27/junos」,並遍歷XSLT中的每個「environment-item」元素。 我想這樣做的原因是,因爲命名空間變化很頻繁,每次都必須改變規則,這是一種皇家的痛苦。 – user1409404

相關問題