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.
如何将选择限制为仅显示美国特定数据?提前感谢您的回复。
解决方案
在开始使用 XSLT 指令之前,您应该开始对 XPath 作为其表达式语言有所了解,并且在那里您可以简单地选择谓词中的条件所适用//Part[Country = 'US']
的元素。Part
Country = 'US'
[Country = 'US']
然后将所选Part
元素作为上下文节点,您可以选择Identification_Data[ID_Type = 'USA-1']/ID
以选择条件成立ID
的元素的子元素。Identification_Data
ID_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-template
or xsl:choose
,简单的 XPath 选择和匹配模式就足够了。
请注意,我必须修复一些输入标记,并且还为元素引入了根元素容器,Part
因为通常 XSLT 输入是格式良好的 XML 文档,而不是一系列Part
或其他元素兄弟元素。
推荐阅读
- javascript - 制作随机座位安排计划应用程序的问题
- javascript - 单击图像后无法在 Phaser 3 中更改场景
- flutter - Visual Studio 代码未运行任何颤振命令
- ios - 如何将自定义视图添加为具有整个视图的导航栏左侧项目可以点击
- php - 如何使用分隔字符串或数组制作嵌套列表?
- typescript - 函数类型是否优先于打字稿中的参数类型?
- python-3.x - PyQt5 中的多个页面
- unity3d - Unity:如何沿特定轴找到向量 3 的值?
- javascript - 如何使用引导弹出框显示图像的放大版本?
- reactjs - 输入验证:当 aria- describeby 引用的元素尚未在 DOM 中时的最佳实践