【发布时间】:2012-07-11 15:55:42
【问题描述】:
我的输入xml文件如下:
<root>
<Property>
<Name>Jack</Name>
<Color>red.green</Color>
</Property>
<Property>
<Name>Jill</Name>
<Color>red.blue</Color>
</Property>
<Property>
<Name>Jim</Name>
<Color>red.orange</Color>
</Property>
<Property>
<Name>Tom</Name>
<Color>black.brown</Color>
</Property>
.
.
.
<Property>
<Name>Tom</Name>
<Color>white</Color>
</Property>
</root>
在 XSLT 1.0 中,我想选择其元素值之前的所有 Property 元素。是相同的,并在 之前取得相同的值。作为一个记录。
示例(使用示例子输入文件) 1) 输入.xml
<root>
<Property>
<Name>Jack</Name>
<Color>red.green</Color>
</Property>
<Property>
<Name>Jill</Name>
<Color>red.blue</Color>
</Property>
<Property>
<Name>Jim</Name>
<Color>red.orange</Color>
</Property>
</root>
示例子输出.xml
<red>
<green>Jack<green>
<blue>Jill<blue>
<orange>Jim<orange>
<red>
2) 输入.xml
<root>
<Property>
<Name>Jack</Name>
<Color>red.green</Color>
</Property>
<Property>
<Name>Jill</Name>
<Color>green.orange</Color>
</Property>
<Property>
<Name>Jim</Name>
<Color>orange.red</Color>
</Property>
<Property>
<Name>Ted</Name>
<Color>brown</Color>
</Property>
</root>
示例子输出.xml
<red>
<green>Jack</green>
</red>
<green>
<orange>Jill<orange>
</green>
<orange>
<red>Jim</red>
</orange>
<brown>Ted</brown>
我在 stackoverflow 本身也问过类似的问题,但我对类似的陈述感到困惑
<xsl:apply-templates select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/>
键在哪里:
<xsl:key name='test' match='Property' use='.'/>
[这里还有一个问题:键的匹配值应该作为 Property 或 root/Property 给出。我认为 key 根据上下文选择 Property 元素。 (这里的上下文是 /root/Property,因为它是语句 <xsl:apply-templates select="/root/Property) 中给出的 XPATH 表达式,这是真的吗,请清楚这一点。]
我真正关心的是
而不是使用这个:
<xsl:apply-templates select="/root/Property[generate-id(.) = generate-id(key('test',Property)[1])]"/>
我可以用这个:
<xsl:apply-templates select="key('test',//root/Property)"/>
钥匙在哪里
<xsl:key name='test' match='Property' use='.'/>
实际区别是什么(在执行和流程方面)?
【问题讨论】:
-
此问题中的最后一行代码在语法上无效,因此您关于仅使用调用
key()函数即可执行分组的说法是错误的(没有根据)。请编辑问题并提供一个完整的工作示例,其他人可以复制和粘贴然后运行和重现(提示:您将无法提供此类示例,因为您的陈述是错误的)。至于所有其他问题,对于单个 SO 问题来说它们太多了,答案需要是完整的讲座。请分成不同的问题。最佳建议:读一本好书。 -
@DimitreNovaatchev,我编辑了这个问题。
-
@DimitreNovaatchev 您可以推荐的任何好书或网站都会有所帮助。我是 XSLT 的新手,最近几天我正在研究 XSLT。因此,最好了解 select 中的 key() 是如何工作的,以及 key() 在 select XPATH 表达式中的 generate-id 函数中是如何工作的?
-
我无法调试这些东西在 XML SPY 内部是如何工作的,所以我想知道内部流程以及 key() 将生成什么树以及 select 将使用什么树等等,?
-
user1497365,这是通常为 Muenchian 分组提供的链接:jenitennison.com/xslt/grouping/muenchian.html。我支持 Michael Kay,您需要阅读一本关于 XSLT 和 XPath 的好书——这里是资源列表:stackoverflow.com/questions/339930/…
标签: xml xslt xslt-1.0 muenchian-grouping