我在 C++ 和 C# 应用程序中做了一些 XPath,但这是我第一次真正在 XSLT 中直接使用它。我有一个格式如下的 XML 文件:
<topLevel>
<foo>
<bar>prefix1_Taxi</bar>
...
</foo>
<foo>
<bar>prefix1_SchoolBus</bar>
...
</foo>
...
<foo>
<bar>prefix2_Taxi</bar>
...
</foo>
<foo>
<bar>prefix2_SchoolBus</bar>
...
</foo>
</topLevel>
首先,我只想选择<foo>
元素<bar>
以“prefix1_”开头的元素。这似乎有效:
<xsl:for-each select="foo[bar[starts-with(., 'prefix1_')]]">
<!-- Style and format the values from child elements of the "prefix1_" <foo> -->
</xsl:for-each>
for-each
然后,我想从块内部选择<foo>
包含相应“prefix2_”元素的元素。然后,我想从每个我认为合适的地方提取数据。
For example, when the for-each
has selected "prefix1_Taxi", I want to then select the foo
element that contains the "prefix2_Taxi" bar
element.
<xsl:for-each select="foo[bar[starts-with(., 'prefix1_')]]">
<!-- Retrieve the corresponding "prefix2_" foo -->
<!-- Style and format the values from child elements of the "prefix1_" <foo> -->
<!-- Style and format the values from child elements of the "prefix2_" <foo> -->
</xsl:for-each>
不幸的是,我不知道该怎么做。在传统程序中,我会执行以下伪代码:
String buf = barElement.Name.Replace("prefix1_", String.Empty);
XmlNode otherFoo = document.SelectSingleNode("foo[bar[" + buf + "]]");
然而,XSLT 显然使用不同的范例来检索值和操作数据,所以我试图打破我的旧思维模式。
使用我从 XSLT 上的一些谷歌搜索中收集到的内容,我想出了一些非常难看的东西:
选择包含以某些文本开头的条的 foo 元素:
foo[bar[starts-with(., ...)
替换我们当前
<bar>
元素中的“prefix1_”:replace(<xsl:value-of select='bar'/>, 'prefix1_', '')
这会产生一个非常丑陋的混乱:
<xsl:value-of select="foo[bar[starts-with(., replace(<xsl:value-of select='bar'/>, 'prefix1_', ''))]]" />
我也很确定该<xsl:value-of>
元素不正确。
我该怎么做?我怀疑我遗漏了一些关于如何在 XSLT 中表达这个概念的核心概念。我正在浏览 XSLT 上的w3.org 页面,但我仍然需要更多的学习和实践。