【发布时间】:2011-11-23 18:57:01
【问题描述】:
我有 XSLT 1.0 标准。 我有一个来自服务器的动态 XML,它非常简单,第二个 XML 作为配置。基于第一个(这是动态的)我必须从第二个中获取正确的节点信息。 这是第一份文件:
<?xml version="1.0" encoding="UTF-8" ?>
<response>
<response>SUCCESS</response>
<responsedata>
<hit>
<url>http://domain.com/page.html</url>
<id>2437</id>
<title>Page title</title>
<language>en</language>
...
...
</hit>
</responsedata>
</response>
第二个配置 XML 用于页脚,页眉按语言划分。类似的东西:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<set id="local">
<header>
<en>
<![CDATA[
<div id="header">
<p>English code</p>
</div>
]]>
</en>
<fr>
<![CDATA[
<div id="header">
<p>French code</p>
</div>
]]>
</fr>
</header>
</set>
</config>
我需要从第二个 XML 中获取正确的语言相关代码。 我尝试了以下代码,但它不起作用:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" encoding="utf-8" indent="yes" doctype-system="about:legacy-compat" />
<xsl:variable name="configuration" select="document('settings.xml')/config/set[@id='local']" />
<xsl:variable name="lang" select="response/responsedata/hit/language" />
<xsl:template name="getvalueofnode">
<xsl:param name="path" />
<xsl:param name="context" select="$configuration" />
<xsl:choose>
<xsl:when test="contains($path,'/')">
<xsl:call-template name="getvalueofnode">
<xsl:with-param name="path"
select="substring-after($path,'/')" />
<xsl:with-param name="context"
select="$context/*[name()=substring-before($path,'/')]" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<p>value: <xsl:value-of select="$context/*[name()=$path]" disable-output-escaping="yes" /></p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:element name="html">
<xsl:attribute name="lang"><xsl:value-of select="$lang" /></xsl:attribute>
<xsl:element name="head">
<xsl:attribute name="lang"><xsl:value-of select="$lang" /></xsl:attribute>
</xsl:element>
<xsl:element name="body">
<xsl:attribute name="lang"><xsl:value-of select="$lang" /></xsl:attribute>
<p>lang: <xsl:value-of select="$lang" /></p>
<p>
<xsl:call-template name="getvalueofnode">
<xsl:with-param name="path" select="concat('/header/',$lang)" />
</xsl:call-template>
</p>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
如果有人有任何建议或解决方案,那就太好了。
【问题讨论】:
标签: xslt dynamic path document xslt-1.0