2013-12-11 29 views
0

我試圖使用XSLT將一個XML文檔轉換爲另一個XML文檔。在XSLT中,如何根據另一個子節點的值顯示子節點的值

原始XML的格式如此;

<NodeList> 
    <Node> 
     <Type>Commercial</Type> 
     <ContactDetail> 
     <Name>The Shop</Name> 
     <Line01>1 The Lane</Line01> 
     <Line02></Line02> 
     <Line03>London</Line03> 
     <PostCode>SW11AA</PostCode> 
     <TelMobile>07777123456</TelMobile> 
     </ContactDetail> 
    </Node> 
    <Node> 
     <Type>Municiple</Type> 
     <ContactDetail> 
     <Name>Some place</Name> 
     <Line01>1 Hub Lane</Line01> 
     <Line02>PLYMOUTH</Line02> 
     <Line03>DEVON</Line03> 
     <Line04></Line04> 
     <PostCode>PL62BB<</PostCode> 
     <TelMobile></TelMobile> 
     </ContactDetail> 
    </Node> 
<NodeList> 

,我需要能夠打印的節點列表/節點的聯繫方式[類型=「商業」],但對我的生命,我找不到這樣做的正確方法。

我認爲沿着一條線;

<xsl:value-of select="NodeList/Node/[Type='Commercial"]/ContactDetails/Name" /> 

當然「ContactDetails」但不「型」的孩子。

任何人都可以指向正確的方向嗎?

回答

2

你在正確的軌道上。刪除節點和您的條件之間的斜線。這樣你就選擇了與括號中的條件匹配的節點元素。

NodeList/Node[Type="Commercial"]/ContactDetail/Name

而且,條件是檢查「商業」,這將給你從報價錯誤,和XPath的結束一直在尋找ContactDetails代替ContactDetail,這就是你們的榜樣有什麼。這兩項在上面的查詢修正

+0

只要我們挑剔,「Municlple」不是字。 –

+0

謝謝,這讓我瘋狂了太久。在條件出現之前,我所得到的額外斜線只是一個錯誤,但我一直在錯誤地將「ContactDetails」放在代碼中。 – David

+0

我感到很傻,但我已經吸取了教訓。謝謝。 – David

2

正確的語法是NodeList/Node[Type='Commercial']/ContactDetails/Name

0

如果您需要訪問重複的節點,可以使用xsl:key,例如:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:key name="nodeTypeKey" match="Node" use="Type" /> 

    <xsl:template match="/"> 
     <xsl:variable name="addressToUse" 
        select="key('nodeTypeKey', 'Commercial')/ContactDetail"> 
     </xsl:variable> 
     <Name><xsl:value-of select="$addressToUse/Name"/></Name> 
     <Tel><xsl:value-of select="$addressToUse/TelMobile"/></Tel> 
     <!-- etc --> 
    </xsl:template> 
</xsl:stylesheet> 
相關問題