我試圖將XML文件的某些部分轉換爲另一個XML文件。源文件:XSLT:在該循環之外的循環內使用表達式的結果
<CUSTOMERS>
<CUSTOMER>
<CUSTOMER_NUMBER>12345678</CUSTOMER_NUMBER>
<CUSTOMER_ADDRESS>
<CUSTOMER_ADDRESS_NAME>John Doe</CUSTOMER_ADDRESS_NAME>
<CUSTOMER_ADDRESS_STREET>Street 1</CUSTOMER_ADDRESS_STREET>
<CUSTOMER_ADDRESS_CITY>Amsterdam</CUSTOMER_ADDRESS_CITY>
</CUSTOMER_ADDRESS>
<CUSTOM_FIELDS>
<CUSTOM_FIELD>
<CUSTOM_FIELD_NAME>Cellphone</CUSTOM_FIELD_NAME>
<CUSTOM_FIELD_VALUE>443209432</CUSTOM_FIELD_VALUE>
</CUSTOM_FIELD>
<CUSTOM_FIELD>
<CUSTOM_FIELD_NAME>Geo</CUSTOM_FIELD_NAME>
<CUSTOM_FIELD_VALUE>323932121,31231233,0</CUSTOM_FIELD_VALUE>
</CUSTOM_FIELD>
</CUSTOM_FIELDS>
</CUSTOMER>
</CUSTOMERS>
規則:
- 不是每個
CUSTOMER
有CUSTOM_FIELDS
,那些沒有CUSTOM_FIELDS
誰不應該被處理。 - 當
CUSTOMER
有CUSTOM_FIELDS
時,所有CUSTOM_FIELDS
的數量和順序可能會有所不同。如果它有一個CUSTOM_FIELD
這名字是'Geo'
所以在我的XSL我試圖遍歷所有CUSTOMERS
,以及通過CUSTOM_FIELDS
每個CUSTOMER
環
CUSTOMER
只應處理。當它找到一個叫做'Geo'
的應該輸出數據。 <xsl:for-each select="CUSTOMERS/CUSTOMER">
<xsl:for-each select="CUSTOM_FIELDS/CUSTOM_FIELD">
<xsl:if test=".[CUSTOM_FIELD_NAME='Geo']">
<Placemark>
<name>
<xsl:value-of select="CUSTOMER_NUMBER" />
<xsl:text> </xsl:text>
<xsl:value-of select="CUSTOMER_ADDRESS/CUSTOMER_ADDRESS_NAME" />
</name>
<styleUrl>#msn_ylw-pushpin</styleUrl>
<Point>
<coordinates>
<xsl:value-of select="CUSTOM_FIELD_NAME" />
</coordinates>
</Point>
</Placemark>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
當然在這一點上我在CUSTOMERS/CUSTOMER/CUSTOM_FIELDS/CUSTOM_FIELD
,但因此它不可能從那些幾級了節點的輸出數據。
我試着在if塊中設置一個變量,然後應該在if塊之後讀取以查看是否應該返回任何數據,但我知道變量只能設置一次,因此無法使用爲此目標。
所以我的問題是:
- 我真的需要一個循環,看看是否有
CUSTOM_FIELD
誰的CUSTOM_FIELD_NAME = 'Geo'
? - 如果需要循環,我如何使用循環內部,循環外部的結果?
- 或者如果這是不可能的,我該如何從節點上的節點返回值,這些節點比我當前所在的節點高出幾級?
感謝您的正確答案,並深入解釋! 我知道必須有一種更有效的方法來實現這一點,但我發現的所有示例和文檔僅列出了非常簡單的案例。 無論如何,再次感謝:-) – Rene 2009-10-20 13:46:08
不客氣。 :-) – Tomalak 2009-10-20 14:53:27