如何使用XPath比较xsl:for循环中的两个XML元素
我有以下问题: 在样式表文档中,我希望从相对简单的xml文件创建输出。 虽然大多数常见的XPath和XSLT内容并没有那么困难,但比较这两个元素并决定如何继续目前是一个相当大的问题 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
<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>