gpt4 book ai didi

xslt - XSLT 2.0:如何替换()元素值的一部分并在选择操作中使用结果?

转载 作者:行者123 更新时间:2023-12-03 17:15:39 30 4
gpt4 key购买 nike

我已经在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>


首先,我只选择具有以“ prefix1_”开头的 <foo>元素的 <bar>元素。这似乎起作用:

<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块内部,选择包含相应的“ prefix2_”元素的 <foo>元素。然后,我想根据需要从每个数据中提取数据。

例如,当 for-each选择了“ prefix1_Taxi”时,我想选择包含“ prefix2_Taxi” foo元素的 bar元素。

<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 page,但是我仍然需要更多的学习和练习。

最佳答案

此XSL样式表应使您在处理包含“ prefix2”的foo元素时具有一定的灵活性。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>

<!-- Matches the top level element and selects the children with prefix1 text. -->
<xsl:template match="topLevel">
<xsl:copy>
<xsl:apply-templates select="foo[bar[starts-with(., 'prefix1_')]]"/>
</xsl:copy>
</xsl:template>

<!-- We're at a foo element with prefix1 text. Select the siblings of the
same vehicle type, with prefix2 text. -->
<xsl:template match="foo[bar[starts-with(., 'prefix1_')]]">
<xsl:variable name="vehicle" select="substring-after(bar, 'prefix1_')"/>
<xsl:apply-templates select="../foo[bar = concat('prefix2_', $vehicle)]"/>
</xsl:template>

<!-- In this template, you can do whatever you want with the foo element containing
the prefix2 vehicles. This example just copies the element and its children. -->
<xsl:template match="foo[bar[starts-with(., 'prefix2_')]]">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>

关于xslt - XSLT 2.0:如何替换()元素值的一部分并在选择操作中使用结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156064/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com