【问题标题】:XSLT 1.0 replace value from variableXSLT 1.0 替换变量中的值
【发布时间】:2014-07-16 06:21:49
【问题描述】:

我有一个 xml 文件,其中为环境定义了一个部分。我想让 XSLT 包含一个可以覆盖这些值的键/值对。例如:

示例 INPUT XML - 是,变量是嵌套的

<root>
<folders/>
<variables>
  <variable>
    <name>homeserver</name>
    <value>myServer.com</value>
    <variable>
    <name>workserver</name>
    <value>work.com</value>
    </variable>
    </variable>
</variables>
</root>

元代码中的示例 XLST:

<xsl:variable name=KeyPair>
  <environment>
    <item name="homeserver" value="testhomeserver.com">
    <item name="workserver" value="testworkserver.com">
</xsl:variable>

<xsl:magic happens here />

预期输出:

<root>
<folders/>
<variables>
  <variable>
    <name>homeserver</name>
    <value>testhomeserver.com</value>
    <variable>
    <name>workserver</name>
    <value>testworkserver.com</value>
    </variable>
    </variable>
</variables>
</root>

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    这在 XSLT 1.0 中并不容易做到,因为 (1) 变量不是节点集,并且 (2) 您不能在此处使用键。

    无论如何,我建议你从一个身份模板开始复制所有内容,然后添加另一个模板来匹配需要替换的值:

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">
    
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:variable name="KeyPair">
        <item name="homeserver" value="testhomeserver.com"/>
        <item name="workserver" value="testworkserver.com"/>
    </xsl:variable>
    <xsl:variable name="KeyPairSet" select="exsl:node-set($KeyPair)" />
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="value">
        <xsl:if test="preceding-sibling::name[1]=$KeyPairSet/item/@name">
            <xsl:copy>
                <xsl:value-of select="$KeyPairSet/item[@name=current()/preceding-sibling::name[1]]/@value" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

    • 变量 $KeyPairSet 不能用于最后一个模板中的表达式。
    • 是否有一个 GetElementById() 等效项,所以我不必尝试导航?
    • @vin "变量 $KeyPairSet 不能用于最后一个模板中的表达式。" 哎呀,你是对的。我已经用宽容的 libxslt 和 Xalan 对此进行了测试,但撒克逊人(理所当然地)坚持。尝试编辑的版本。 -- 不确定你在第二条评论中的意思。
    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多