基于存储在另一个元素中的键选择XML元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于存储在另一个元素中的键选择XML元素相关的知识,希望对你有一定的参考价值。

不熟悉xsl,所以我很抱歉这是一个常见问题-

我有一些看起来像这样的xml(示例已简化,但这是我用来弄乱的东西:):

<root>
  <items>
    <item>
      <value>1</value>
      <id>1</id>
    </item>
    <item>
      <value>2</value>
      <id>2</id>
    </item>
    <item>
      <value>99</value>
      <id>3</id>
    </item>
  </items>
  <itemList>
    <id>1</id>
    <id>2</id>
  </itemList>
</root>

我的用例是这样的:我需要从项目列表中删除ID,然后使用这些ID来识别“项目”中的项目。然后,我需要获取项目的值并通过聚合传递任意数量的值,以获得我需要的最终结果(“ sumItems”是我实现的更复杂的递归模板的替代品)。这是我到目前为止使用的xsl,我正在尝试优化顶部的with-param select属性:

  <xsl:template match="*">
    <xsl:call-template name="sumItems">
      <xsl:with-param name="nodeSet" select="//item/id[text()=1 or text()=2]/.." />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="sumItems">
    <xsl:param name="nodeSet" />
    <xsl:param name="tempSum" select="0" />

    <xsl:choose>
      <xsl:when test="not($nodeSet)">
        <xsl:value-of select="$tempSum" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="value" select="$nodeSet[1]/value" />
        <xsl:call-template name="sumItems">
          <xsl:with-param name="nodeSet" select="$nodeSet[position() > 1]" />
          <xsl:with-param name="tempSum" select="$tempSum + $value" />
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

我是否有可能通过选择中包含某种子查询来执行类似的操作?

 select="//item/id[text()=(//itemList/id)]/.."

如果相关,我正在从.Net XslCompiledTransform运行它。

答案

我不知道这是否会让我变得更聪明或更笨拙,但是当我将其扔到xsl中时,我在问题底部发来的暗中猜测实际上似乎有效。甚至没有语法错误。很抱歉给您带来麻烦-这是工作代码:

另一答案

[使用用<xsl:key name="item-by-id" match="items/item" use="id"/>声明的键,然后您可以使用key('item-by-id', //itemList/id)选择item元素引用的itemList/id元素,并使用sum(key('item-by-id', //itemList/id)/value)计算value元素的总和。

以上是关于基于存储在另一个元素中的键选择XML元素的主要内容,如果未能解决你的问题,请参考以下文章

通过 C++ 中的外部函数更改存储在另一个对象的向量中的对象中元素的值

使用来自子元素的数据在 php 中使用 simplexml 选择其他元素中的数据

算法----散列

基于子元素值使用 PLSQL 提取 XML

如何使选择列表出现在另一个元素上?

在jQuery的XML文档中选择和操作DOM中的元素?