重复节点的条件值选择

时间:2019-04-12 21:37:32

标签: xslt-2.0

我是使用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.

如何限制选择以仅显示美国特定数据? 预先感谢您的回复。

1 个答案:

答案 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}的序列}或其他元素同级。