XSLT 2.0 for 循环一个与其他 XML 中的数据匹配的 XML 节点

Posted

技术标签:

【中文标题】XSLT 2.0 for 循环一个与其他 XML 中的数据匹配的 XML 节点【英文标题】:XSLT 2.0 for loop one XML node which matches with data in other XML 【发布时间】:2021-11-12 06:33:51 【问题描述】:

我正在尝试使用下面给出的 XSLT 伪代码在根节点上与 XML A 匹配的 XML B 下方循环。由于我是 XSLT 新手,请帮忙

XML A:

<P_OUT_PARTNUMBERS>
        <Row>
            <Column>53</Column>
        </Row>
        <Row>
            <Column>54</Column>
        </Row>
</P_OUT_PARTNUMBERS>

XML B:

<P_OUT_PARTNUMBERS>
        <Root>
            <Field>53</Field>
        </Root>
        <Root>
            <Field>30</Field>
        </Root>
</P_OUT_PARTNUMBERS>

XSLT:

<xsl:for-each select="$XMLB/Root">
    <xsl:variable name="Fieldvalue" select ="/Field"/>
    <xsl:if test="$XMLA/Row[Column = $Fieldvalue]/Column" >
          <xsl:value-of select="position()"/>
    </xsl:if>
</xsl:for-each>

我想要像下面这样的东西,因为我不想因为 if 条件而失去 position() 的值。即 position() 值应该是 1,2,3,..etc 与我的逻辑我得到 1,3,6,8,..etc 不连续

【问题讨论】:

如果两个样本正好有两个项目(即RootRow 元素)要比较,则不清楚1,2,3 的所需结果与什么相关。所以也许用简单的英语解释你想要选择哪些元素,或者输入应该如何映射到一个整数序列,比如1,2,3。如果您的代码给出了1,3,6,8,那么请发布最小但完整的工作示例来证明这一点。 position() for-each 循环中的函数必须给出 1,2,3.. 即连续数字。现在我在 for-each 循环中有 if 条件,因为 position() 值没有给出连续的数字 您在xsl:if 内部使用&lt;xsl:value-of select="position()"/&gt;,如果这不是您想要的,则将其移到外面。但我建议您停止考虑“循环”,而是尝试解释您想要选择哪些输入节点以及如何将它们映射到确切的输出序列。 我想输出 position() 值。我希望这个 position() 在 if 条件之后返回 1,2,3,4...等。如果条件满足,那么 position() 值会增加,我不想发生这种情况 我们错过了与您的输入文件相对应的所需输出。请编辑您的问题以添加缺失的信息。 【参考方案1】:

如果 position() 函数没有完成您期望或希望它完成的工作,如果您的解释依赖于询问 position() 它没有完成的事情,我们将很难理解您想要实现的目标.输入/输出映射的任务是什么?

如果您想处理P_OUT_PARTNUMBERS/Root[key('col', Field, $docA)],那么也许只需使用密钥即可,例如&lt;xsl:key name="col" match="P_OUT_PARTNUMBERS/Row" use="Column"/&gt;。一般来说,从嵌套的xsl:ifs 到简单谓词的移动条件可能更符合具有连续序列的路线。

【讨论】:

以上是关于XSLT 2.0 for 循环一个与其他 XML 中的数据匹配的 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 2.0:根据 for-each -group 的当前索引评估和修改元素值

For 循环与应用模板

通过 linux shell 进行 XSLT 2.0 转换

SSIS - XML 任务未使用我创建的 XSLT-2.0 转换我的 XML 文件

xslt 2.0 替换为 xml 结构

XSLT(2.0 或 3.0)方法将存储在 xml 中的每个逗号分隔值的整个 xml 复制到单独的 xml 文件中