首页 > 解决方案 > 重复节点的条件值选择

问题描述

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

如何将选择限制为仅显示美国特定数据?提前感谢您的回复。

标签: xslt-2.0

解决方案


在开始使用 XSLT 指令之前,您应该开始对 XPath 作为其表达式语言有所了解,并且在那里您可以简单地选择谓词中的条件所适用//Part[Country = 'US']的元素。PartCountry = 'US'[Country = 'US']

然后将所选Part元素作为上下文节点,您可以选择Identification_Data[ID_Type = 'USA-1']/ID以选择条件成立ID的元素的子元素。Identification_DataID_Type = 'USA-1'

要在 XSLT 中使用这些 XPath 表达式,您可以简单地使用

<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>

https://xsltfiddle.liberty-development.net/94rmq6q/1上的示例。

所以不需要任何xsl:call-templateor xsl:choose,简单的 XPath 选择和匹配模式就足够了。

请注意,我必须修复一些输入标记,并且还为元素引入了根元素容器,Part因为通常 XSLT 输入是格式良好的 XML 文档,而不是一系列Part或其他元素兄弟元素。


推荐阅读