在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?

Posted

技术标签:

【中文标题】在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?【英文标题】:In XSLT how to select a value from a node using IDs in which there is multiple of the same nodes? 【发布时间】:2020-05-02 12:45:32 【问题描述】:

我正在尝试从具有相同名称的多个节点中选择值,但我无法创建成功的变量或 IF 语句。

在下面的示例中,我试图弄清楚如何在 XSLT 中创建一个 IF 语句,说明来自 Houses 节点的 IF HouseID 和 HouseNo 与来自 Streets 节点的 HouseID 和 HouseNo 匹配,然后显示匹配节点的价格。

XML 示例如下:

<pi:Houses>
 <pi:HouseID>1111</pi:HouseID>
 <pi:HouseNo>012</pi:HouseNo>
 <pi:Price>100000</piPrice>
</pi:House>

<pi:Streets>
 <pi:HouseID>1111</pi:HouseID>
 <pi:HouseNo>012</pi:HouseNo>
 <pi:Price>100000</piPrice>
</pi:Streets>

<pi:Houses> 
 <pi:HouseID>2222</pi:HouseID>
 <pi:HouseNo>098</pi:HouseNo>
 <pi:Price>9000000</piPrice>
</pi:House>

<pi:Streets>
 <pi:HouseID>2222</pi:HouseID>
 <pi:HouseNo>098</pi:HouseNo>
 <pi:Price>9000000</piPrice>
</pi:Streets>

我目前正在尝试使用

<xsl:if test ="pi:Houses/pi:HouseID = pi:Streets/HouseID">
<xsl:value-of select="pi:Houses/pi:Price"/>
</xsl:if>

但这给了我两个值。 我尝试过使用 position() 运算符,但没有尝试过。

任何建议都会很棒,谢谢!

【问题讨论】:

您能否向我们展示一个最小但格式良好的 XML 示例文档以及输出这两个值的最小但完整的 XSLT?目前尚不清楚您在什么上下文或容器中拥有示例元素,也不清楚您的 xsl:if 的上下文。 【参考方案1】:

我过去曾使用变量解决过这个问题。

在这个例子中,我去掉了命名空间以便于阅读

<xsl:for-each select='//Streets'>
  <xsl:variable name='id' select='HouseID'/>

  <p>
    Street HouseID:<xsl:value-of select='$id'/><br/>
    House Price: <xsl:value-of select='../Houses[HouseID=$id]/Price'/>
  </p>

</xsl:for-each>

【讨论】:

以上是关于在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 组合具有相同 ID 及其值的节点 (XML)

使用 XSLT 基于 ID 从多个 xPath 中选择 XML 节点

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件

XSLT 1.0 将同一级别的多个相同节点以不同的值分组

如何在 XSLT 中拆分数据并存储在多个节点中

具有相同级别下重复节点的 XSLT 变换