【问题标题】:Conditional value select for repeating nodes重复节点的条件值选择
【发布时间】:2019-09-03 16:45:33
【问题描述】:

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


    【解决方案1】:

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

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

    要在 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-templatexsl:choose,简单的XPath 选择和匹配模式就足够了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多