Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XPath比较xsl:for循环中的两个XML元素_Xml_Xslt_Xpath - Fatal编程技术网

如何使用XPath比较xsl:for循环中的两个XML元素

如何使用XPath比较xsl:for循环中的两个XML元素,xml,xslt,xpath,Xml,Xslt,Xpath,我有以下问题: 在样式表文档中,我希望从相对简单的xml文件创建输出。 虽然大多数常见的XPath和XSLT内容并没有那么困难,但比较这两个元素并决定如何继续目前是一个相当大的问题 xml示例: <root> <foo> <value>1</value> <name>foo1</name> </foo> <foo> <val

我有以下问题:

在样式表文档中,我希望从相对简单的xml文件创建输出。 虽然大多数常见的XPath和XSLT内容并没有那么困难,但比较这两个元素并决定如何继续目前是一个相当大的问题

xml示例:

<root>
    <foo>
        <value>1</value>
        <name>foo1</name>
    </foo>
    <foo>
        <value>2</value>
        <name></name>
    </foo>
    <foo>
        <value>3</value>
        <name>foo3</name>
    </foo>

    <bar>
        <value>1</value>
    </bar>
    <bar>
        <value>2</value>
    </bar>
</root>

1.
foo1
2.
3.
foo3
1.
2.
样式表中有一个xsl:for循环,它试图决定是否显示当前节点:

[...]
<xsl:for-each select="bar">
    <xsl:if test="//foo[value=./value]/name">
        <!-- go on, if the content of the 'name' element is not empty -->
    </xsl:if>
</xsl:for-each>
[...]
[…]
[...]
其目的只是为了在“foo”中的“name”元素的内容不为空的情况下,使用“value”元素的Equality继续使用这些内容。 结果是,“bar”中的每一行都会创建一个输出事件,如果我不打算为第二个条目创建输出事件,因为“//foo[2]/name”为空

我不确定,目前如何进行。。。也许生成的密钥就足够了!?我不知道

谢谢你的评论

使用一个键,例如

<xsl:key name="k1" match="foo" use="value"/>

您可能希望使用以下内容:

<xsl:template match="/">
    <root>
        <xsl:for-each select="//bar">
            <xsl:for-each select="//foo[value=current()/value]">
                <xsl:if test="name != ''">
                    <xsl:copy-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>
    </root>
</xsl:template>

最引人注目的当然是您应该使用current()/value而不是./value,因为current()引用了bar元素,并且。指循环的foo元素

当应用于提供的输入时,这将给出

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <foo>
        <value>1</value>
        <name>foo1</name>
    </foo>
</root>

1.
foo1

我想我所做的只是再次检查“//foo/value”本身,这很可能最终会变成“真的”。嗯。。。在上下文中,我可能使用'foo'元素中的'value'节点将其与自身进行比较,我尝试使用“//foo[value=current()/value]/name”而不是“//foo[value=./value]/name”,这可能会奏效,因为所讨论的行不再打印。但是,如果你有任何更多的建议,请发表评论!我得出了相同的结论:-)请看下面的答案。由于我只是偶尔使用XSLT/XPath,因此我的知识有时无法胜任我想要执行的任务。。。例如:我理解您的aproach,但我从来没有想过“xsl:copy of”元素的用法。不错。我会努力记住的!在写这个问题时,我想到了这个解决方案,但由于我不太了解,我的尝试没有成功,所以我取消了这个尝试,并使用了简单的方法,使用“//foo[value=current()/value]/name”。不过还是要谢谢你,我也试过了!我刚刚试过了,正如你建议的那样,它很有效。我对“xsl:for each”中的XPath查询有点困惑,结果可能是“foo”节点而不是“bar”,但由于查询以“bar”开头,这只不过是一个误解:-)非常感谢!
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <foo>
        <value>1</value>
        <name>foo1</name>
    </foo>
</root>