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