gpt4 book ai didi

xml - XSLT 1.0 值查找映射

转载 作者:数据小太阳 更新时间:2023-10-29 02:56:27 25 4
gpt4 key购买 nike

我是 XSLT 的新手,花了相当多的时间来掌握创建一个内联查找映射,以将特定值替换为 XSLT 2.0 中映射列表的另一个值,结果发现我只能使用1.0。 :-(

我的问题是如何在 1.0 中复制以下有效的 XSLT 2.0 代码。我尝试了一些方法,但似乎无法正常工作。

请注意,如果没有 map ,则该元素应为空。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>


<xsl:variable name="mapxml" >
<map>
<Country>
<input value="GB">RZ</input>
<input value="FR">TH</input>
</Country>
</map>
</xsl:variable>


<xsl:variable name="vMap"
select="$mapxml" />


<xsl:key name="kInputByVal" match="input"
use="@value" />


<xsl:template match="Country/text()">
<xsl:sequence select=
"(key('kInputByVal', ., $vMap/*/Country)[1]/text()
)[1]
"/>

</xsl:template>
</xsl:stylesheet>

输入 XML:

 <user>
<Country>GB</Country>
<Name>FOO</Name>
<Address>BAR</Address>
<user>

最佳答案

这是等效的 XSLT 1.0 程序:

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

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<my:config>
<map>
<Country>
<input value="GB">RZ</input>
<input value="FR">TH</input>
</Country>
</map>
</my:config>
<xsl:variable name="vCountryMap" select="document('')/*/my:config/map/Country/input" />

<xsl:template match="Country/text()">
<xsl:value-of select="$vCountryMap[@value = current()]" />
</xsl:template>
</xsl:stylesheet>

注意事项:

  • 您可以在 XSLT 中设置额外的节点,因为 XSLT 本身就是 XML。例如配置数据,就像这里一样。您只需要确保为它们使用不同的命名空间。
  • namespace URI 需要是唯一的,它们不需要指向现有文档。临时 URI,如 http://tempuri.org/dummy完全没问题。
  • <xsl:strip-space elements="*" />指示 XSLT 处理器忽略输入中无关紧要的空格。这有助于创建整齐缩进的输出。
  • document('')指 XSLT 样式表本身。如果需要,您还可以将配置保存在一个额外的 XML 文件中。
  • exclude-result-prefixes防止我们的临时 namespace 泄漏到输出。
  • current()指 XSLT 处理器当前正在处理的节点。 ($vCountryMap[@value = .] 不起作用,因为这里的 . 指的是 XPath 上下文,即 <input> 节点。)

关于xml - XSLT 1.0 值查找映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32439555/

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