Xml 使用xslt创建语言选择器

Xml 使用xslt创建语言选择器,xml,xslt,Xml,Xslt,我有一个XML和一个XSLT。我应该生成一个包含XML文件内容的PDF 在XML中,应该使用一个元素来选择输出应该是哪种语言 然后,我希望将所有三种不同的语言作为变量列在xsl中,并使用xml中的值来选择使用哪种语言 因此,在我的xsl中: 英文标题 法文标题 西班牙语标题 <xsl:variable name="en_text">Text in english</xsl:variable> <xsl:variable name="fr_text">Text

我有一个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>
...
en
...
在我的xsl中,我希望将XML中的值from Language元素与xsl文件中的后缀连接起来。所以我可以写一些东西,比如:

<block><xsl:value-of select="(value from Language element in xml> + _head")</xsl:value-        of></block>

XML将
XML:lang
属性标准化并指定为使用
lang
函数标记语言和XSLT/XPath支持

因此,我强烈建议使用该机制,而不是构建自己的机制

使用XSLT2.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>

即使在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处理器中也有等效的函数。

我得到了这样的错误:错误:“非静态Java函数“nodeSet”的第一个参数不是有效的对象引用。”我的样式表可能有问题吗?您使用的是像Saxon 9这样的XSLT 2.0处理器还是IBM websphere XML软件包中的处理器?你认为我上面的建议有错误吗?它不使用
nodeSet
函数。如果您使用的是XSLT 1.0处理器,那么正如MiMo所指出的,您需要在变量内容上使用扩展函数,例如
。Java XSLT处理器不支持MiMo使用的URL,它将与Microsoft的MSXML或XslTransform一起使用。