我试图将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