XSLT 1.0替换变量中的值

时间:2014-07-16 06:21:50

标签: xml xslt xslt-1.0

我有一个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>

1 个答案:

答案 0 :(得分:0)

这在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>