使用XSLT

时间:2018-08-01 06:37:26

标签: xml xslt xquery

我正在尝试将循环中当前元素的属性与所有其他属性进行比较。我不确定我是否做对了,所以这是我的尝试

这是XML文件:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="sample.xsd">

    <foo>
        <subfoo id="123">Foo 1</subfoo>
        <subfoo id="345">Foo 2</subfoo>
        <subfoo id="678">Foo 3</subfoo>
    </foo>

    <bar id="U123">
        <subbar>Hello World</subbar>
    </bar>

    <bar id="345">
        <subbar>Hello Other World</subbar>
    </bar>

    <bar id="912">
        <subbar>Hello 3rd World</subbar>
    </bar>

</root>

这是XSLT文件:

  <xsl:template match="root">

            <xsl:variable name="subfoo" select="root/foo/subfoo"/>
            <xsl:variable name="subbar" select="root/bar"/>
            <xsl:for-each select="$subfoo">
                <xsl:variable name="subfooID" select="./@id"/>
                <xsl:for-each select="$subbar">
                    <xsl:if test="$subfooID = ./@id">
                        <xsl:if test="./@id[current()] = @id">
                            <xsl:value-of select="subfoo"/> Matches <xsl:value-of select="subbar"/>
                        </xsl:if>
                    </xsl:if>
                </xsl:for-each>
            </xsl:for-each>

  </xsl:template>

如果两个ID匹配,则输出应显示类似

Foo 1 Matches Hello World
Foo 2 Matches Hello Other World

有人可以帮我找到我在这里想念的东西吗? 问候。

1 个答案:

答案 0 :(得分:2)

我只需要为交叉引用定义一个键,然后处理存在交叉引用的元素:

<iframe src='https://webchat.botframework.com/embed/{BotId_HERE}?s={YOUR_SECRET_HERE}&userid={Your_userid_HERE}' width="300px" height="450px"></iframe>

https://xsltfiddle.liberty-development.net/94hvTzo

在尝试中,您遇到了很多错误的路径,因为您似乎不知道<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:key name="bar" match="bar" use="@id"/> <xsl:template match="root"> <xsl:apply-templates select="foo/subfoo[key('bar', @id)]"/> </xsl:template> <xsl:template match="subfoo"> <xsl:value-of select="concat(., ' matches ', key('bar', @id)/subbar, '&#10;')"/> </xsl:template> </xsl:stylesheet> xsl:template会更改上下文,因此您需要更改例如xsl:for-eachselect="root/foo/subfoo"