我是使用XSLT的新手,我的一个程序遇到了问题。我试图用我有限的知识来解决这个问题,但无济于事。我正在尝试处理XML文件以仅获取美国零件。数据包含中国和美国部分。数据包含在重复的节点中。
我尝试使用条件语句来限制选择,使其仅获得美国零件ID。但是,我得到了所有零件的ID。
这是XML输入文件的示例:
<Part>
<Part_ID>Comp-97531</Part_ID>
<Country>US</Country>
<Identification_Data>
<Product>Finished</Product>
<ID>12345678909876</ID>
<ID_Type>CHN-1</ID_Type>
<Identification_Data>
<Identification_Data>
<Product>Finished</Product>
<ID>123456789</ID>
<ID_Type>CHN-2</ID_Type>
</Identification_Data>
<Identification_Data>
<Product>Finished</Product>
<ID>13579</ID>
<ID_Type>CHN-3</ID_Type>
</Identification_Data>
<Identification_Data>
<Product>Finished</Product>
<ID>555555555</ID>
<ID_Type>USA-1</ID_Type>
</Identification_Data>
</Part>
<Part>
<Part_ID>Comp-95137</Part_ID>
<Country>US</Country>
<Identification_Data>
<Product>Finished</Product>
<ID>1234567812345</ID>
<ID_Type>CHN-1</ID_Type>
<Identification_Data>
<Identification_Data>
<Product>Finished</Product>
<ID>987654321</ID>
<ID_Type>CHN-2</ID_Type>
</Identification_Data>
<Identification_Data>
<Product>Finished</Product>
<ID>246810</ID>
<ID_Type>CHN-3</ID_Type>
</Identification_Data>
<Identification_Data>
<Product>Finished</Product>
<ID>777777777</ID>
<ID_Type>USA-1</ID_Type>
</Identification_Data>
</Part>
这是我正在尝试的XSLT代码:
<xsl:template match="/">
<FILE>
<xsl:for-each select="Part">
<xsl:call-template name="ProductRecord"/>
</xsl:for-each>
</FILE>
</xsl:template>
<xsl:template name="ProductRecord">
<ID>
<xsl:choose>
<xsl:when test="Country = 'US'">
<xsl:if test="Identification_Data/ID_Type='USA-1'">
<xsl:value-of select="Identification_Data/ID"/>
</xsl:if>
</xsl:when>
</xsl:choose>
</ID>
</xsl:template>
要求是仅获取ID_TYPE = USA-1在美国制造的零件。 使用XSLT代码,我只希望ID_Type = USA-1的值为555555555。但是,我得到的输出是这样的:
12345678909876 123456789 13579 555555555.
如何限制选择以仅显示美国特定数据? 预先感谢您的回复。
答案 0 :(得分:0)
在开始使用XSLT指令之前,您应该开始对XPath作为其表达语言有所了解,然后您可以选择//Part[Country = 'US']
来选择条件{{1 }}在谓词Part
中成立。
然后使用选定的Country = 'US'
元素作为上下文节点,您可以选择[Country = 'US']
从Part
元素的Identification_Data[ID_Type = 'USA-1']/ID
子元素中选择条件ID
成立。
要在XSLT中使用这些XPath表达式,则可以简单地使用
Identification_Data
示例https://xsltfiddle.liberty-development.net/94rmq6q/1。
因此不需要任何ID_Type = 'USA-1'
或<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:template match="root">
<xsl:apply-templates select="Part[Country = 'US']"/>
</xsl:template>
<xsl:template match="Part">
<xsl:copy-of select="Identification_Data[ID_Type = 'USA-1']/ID"/>
</xsl:template>
</xsl:stylesheet>
,简单的XPath选择和匹配模式就足够了。
请注意,我必须修复一些输入标记,并且还为xsl:call-template
元素引入了一个根元素容器,因为通常XSLT输入是格式良好的XML文档,而不是{{1}的序列}或其他元素同级。