使用 xslt 创建语言选择器
Posted
技术标签:
【中文标题】使用 xslt 创建语言选择器【英文标题】:Create a language selector with xslt 【发布时间】:2013-06-09 15:55:03 【问题描述】:我有一个 XML 和一个 XSLT。我应该使用 XML 文件中的内容生成 PDF。
在 XML 中有一个元素应该用来选择输出应该是哪种语言。
然后我想在 xsl 中列出所有三种不同的语言作为变量,并使用我的 xml 中的值来选择使用哪一种。
所以在我的 xsl 中: 英文标题 法文标题 西班牙语标题
<xsl:variable name="en_text">Text in english</xsl:variable>
<xsl:variable name="fr_text">Text in french</xsl:variable>
<xsl:variable name="dk_text">Text in spanish</xsl:variable>
在我的 XML 中:
<Language>en</Language>
...
在我的 xsl 中,我想将 XML 中 Language 元素的值与 xsl 文件中的后缀连接起来。所以我可以写这样的东西:
<block><xsl:value-of select="(value from Language element in xml> + _head")</xsl:value- of></block>
然后输出应该是变量 $en_head 的值。
感谢您对此案的任何回复。
【问题讨论】:
【参考方案1】:即使在 XSLT 1.0 中,您也可以执行 Martin 建议的操作:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="my-text">
<text xml:lang="en">Text in English</text>
<text xml:lang="fr">Texte en français</text>
<text xml:lang="es">Texto en español</text>
</xsl:variable>
<xsl:template match="/*">
<xsl:variable name="language" select="Language"/>
<block>
<xsl:value-of select="msxsl:node-set($my-text)/text[lang($language)]"/>
</block>
</xsl:template>
</xsl:stylesheet>
msxsl:node-set
是 Microsoft 特定的函数,用于将 XML 片段转换为节点集,但在其他 XSLT 1.0 处理器中也有等效函数。
【讨论】:
【参考方案2】:XML 具有标准化的 xml:lang
属性,并通过使用 lang
函数 http://www.w3.org/TR/xpath/#function-lang 来标记语言和 XSLT/XPath 支持。
因此,我强烈建议使用该机制而不是构建自己的机制。
使用 XSLT 2.0,您可以轻松定义
<xsl:variable name="my-text">
<list>
<text xml:lang="en">Text in English</text>
<text xml:lang="fr">Texte en français</text>
<text xml:lang="es">Texto en español</text>
</list>
</xsl:variable>
然后使用
<xsl:template match="Foo">
<block><xsl:value-of select="$my-text/list/text[lang(current()/Language)]"/></block>
</xsl:template>
【讨论】:
我收到此错误:错误:'非静态 Java 函数 'nodeSet' 的第一个参数不是有效的对象引用。'我的样式表有问题吗? 您使用的是像 Saxon 9 这样的 XSLT 2.0 处理器还是 IBM 的 websphere XML 软件包中的处理器?你对我上面提出的建议有这个错误吗?它不使用nodeSet
函数。如果您使用的是 XSLT 1.0 处理器,那么正如 MiMo 所指出的,您需要在变量内容上使用扩展函数,例如<xsl:value-of select="exsl:node-set($my-text)/list/text[lang(current()/Language)]" xmlns:exsl="http://exslt.org/common"/>
。 MiMo 使用的 URL 不受 Java XSLT 处理器的支持,它是与 Microsoft 的 MSXML 或 XslTransform 一起使用的一种。以上是关于使用 xslt 创建语言选择器的主要内容,如果未能解决你的问题,请参考以下文章