使用 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 所指出的,您需要在变量内容上使用扩展函数,例如&lt;xsl:value-of select="exsl:node-set($my-text)/list/text[lang(current()/Language)]" xmlns:exsl="http://exslt.org/common"/&gt;。 MiMo 使用的 URL 不受 Java XSLT 处理器的支持,它是与 Microsoft 的 MSXML 或 XslTransform 一起使用的一种。

以上是关于使用 xslt 创建语言选择器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 显示 XSD 验证的 XML

CSS选择器

在 SharePoint2010 中使用 XML 查看器取得其他站点的内容列表

使用Swift语言自动在日期选择器中选择日期

使用日期选择器和时刻处理不同语言的日期

css选择器