2017-07-21 98 views
0

我正在使用XSL和XPATH遍歷,讀取和轉換複雜的XML文件,其中具有多個名稱相同但值不同的節點。我的示例XML文件低於 -使用xpath和xsl遍歷xml文檔

<core> 
    <address> 
     <postalZipCode>90017</postalZipCode> 
     <updateSource>xxxxxx</updateSource> 
     <city>LOS ANGELES</city> 
     <stateProvince>CA</stateProvince> 
     <type>MAILING</type> 
     <line1>818 WEST SEVENTH STREET</line1> 
    </address> 
    <address> 
     <postalZipCode>95014</postalZipCode> 
     <updateSource>xxxxxx</updateSource> 
     <city>CUPERTINO</city> 
     <stateProvince>CA</stateProvince> 
     <type>PRIMARY</type> 
     <line1>1234 XYZ STREET</line1> 
    </address> 
    <memberId>0</memberId> 
</core> 

當我讀的郵件地址線1的值,我得到的值是「1234 XYZ STREET」基本上是主地址。這是我的XSL文件片段: -

<xsl:template match="core">  
    <xsl:if test="memberId['0'] and address/type['MAILING']"> 
    <fo:table-row> 
     <fo:table-cell><fo:block /></fo:table-cell>      
     <fo:table-cell xsl:use-attribute-sets="data"> 
      <fo:block>Line 1</fo:block> 
     </fo:table-cell> 
     <fo:table-cell xsl:use-attribute-sets="data"> 
      <fo:block><xsl:value-of select="address/line1/text()"/> 
     </fo:block> 
     </fo:table-cell>            
    </fo:table-row> 

可以在這裏的高手請建議如果有可能的任何其他方式強制XSL來讀取其中的地址是郵寄正確的值,而不是讀它找到的第一個值???

+0

「*我得到的數值是」1234 XYZ STREET「*」不,這是**不是**值,您正在使用您在此發佈的代碼。 –

回答

1

,如果有可能的任何其他方式強制XSL來讀取其中的地址郵寄,而不是讀的第一個值 找到正確 值???

你的問題是相當混亂,因爲郵寄在你的榜樣的第一個地址 - 你展現片段確實產生你說的它的結果。

在任何情況下,要確保你從郵件地址獲取數據,而不管其位置,改變這種:

<xsl:value-of select="address/line1/text()"/> 

到:

<xsl:value-of select="address[type='MAILING']/line1"/> 

要理解這一點是如何工作的,閱讀更多關於predicates

1

你寫的代碼是「如果有一個類型爲MAILING的地址,那麼打印地址/行1的值(不管這與MAILING類型的地址有什麼關係)」。

在XSLT 1.0中,當xsl:value-of選擇多個節點時,它顯示它找到的第一個節點的值。在XSLT 2.0中,它將所有選定節點的值與缺省爲單個空格的分隔符連接起來。

如果有多個節點並且您想要選擇一個特定的節點,請使用謂詞將其選中。 xsl:value-of select="address[@type='MAILING']/line1

+0

「*在XSLT 2.0中,這是一個錯誤。*」在XSLT 2.0規範中找不到任何描述此類錯誤的內容。相反,'xsl:value-of'指令甚至有一個'separator'屬性來處理多個節點選擇。 –

+0

對不起,是的,我弄錯了。 XSLT 1.0中選擇節點集的第一個節點的大多數事情在XSLT 2.0中都成爲錯誤,但xsl:value-of是例外情況:它更改爲處理節點集中的所有節點。更正答案。 –