使用xml作为xsl变量

使用xml作为xsl变量,xml,xslt,xsl-fo,xalan,Xml,Xslt,Xsl Fo,Xalan,我必须用两个不同语言的文本块创建稍微动态的pdf(两个变量) 两个块中的大多数文本都是静态的 我在考虑是否可以创建一个模板,为布局创建xsl fo。然后创建两个包含自定义xml的变量。比如: <xsl:variable name="TEXT_CONTENT_ENG" > <STATIC_TEXT> <LABEL>Hello</LABEL> <REQUEST>Please pay your bill before <

我必须用两个不同语言的文本块创建稍微动态的pdf(两个变量)

两个块中的大多数文本都是静态的

我在考虑是否可以创建一个模板,为布局创建xsl fo。然后创建两个包含自定义xml的变量。比如:

<xsl:variable name="TEXT_CONTENT_ENG" >
  <STATIC_TEXT> 
   <LABEL>Hello</LABEL>
   <REQUEST>Please pay your bill before </REQUEST>
  </STATIC_TEXT>
</xsl:variable>

你好
请在结账前付账
最后,我可以使用这些变量应用创建的模板两次

xsl似乎使用给定变量进行验证,但我无法将模板应用于该xml。尝试并记录($TEXT\u CONTENT\u ENG)都不起作用


这可能吗?如何做到这一点?

使用xalan,我可以这样做:

<xsl:apply-templates select="xalan:nodeset($TEXT_CONTENT_ENG)/STATIC_TEXT"/>

exslt也提供类似的功能

两个块中的大多数文本都是 静止的

如果这是真的,那么正确的XSLT方式是内联数据。从

此外,xsl:stylesheet 元素可以包含任何未包含的元素 如果 元素的扩展名具有 非空命名空间URI。在场 这些顶级元素的 更改XSLT元素的行为 以及本文中定义的功能 文件;例如,它不会是 允许这样一个顶级元素 指定xsl:apply模板 就是用不同的规则来解决 冲突。因此,XSLT处理器非常重要 总是可以自由地忽略这样的顶级问题 元素,并且必须忽略顶级 元素,但如果 无法识别命名空间URI。 这些要素可以提供: 例如

  • 扩展元素或扩展函数使用的信息(请参见
    [14扩展]

  • 有关如何处理结果树的信息

  • 有关如何获取源树的信息

  • 关于样式表的元数据

  • 样式表的结构化文档


你好
请在结账前付账
输出:

<STATIC_TEXT>
    <LABEL>Hello</LABEL>
    <REQUEST>Please pay your bill before </REQUEST>
</STATIC_TEXT>

你好
请在结账前付账

注意:在XML 1.0中,只能重置默认名称空间。

Alejandro的回答大体正确,但名称空间的非常规使用有点令人困惑,他将数据包装在一个不必要的
xsl:variable
元素中,这也有点让人困惑

只要将元素放在它自己的名称空间中,就可以使它成为
xsl:stylesheet
元素的子元素。然后,您可以使用
document(“”)
访问它,它返回当前XSLT文档:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:in="urn:inline-data"
    exclude-result-prefixes="in"
>

   <in:TEXT_CONTENT_ENG>
      <STATIC_TEXT> 
         <LABEL>Hello</LABEL>
         <REQUEST>Please pay your bill before </REQUEST>
      </STATIC_TEXT>
   </in:TEXT_CONTENT_ENG>

   <xsl:template match="/">
      <output>
         <xsl:apply-templates 
             select="document('')/xsl:stylesheet/in:TEXT_CONTENT_ENG/*"/>
      </output>
   </xsl:template>

   <xsl:template match="STATIC_TEXT">
      <xsl:text>The label is </xsl:text>
      <xsl:value-of select="LABEL"/>
      <xsl:text> and the request is </xsl:text>
      <xsl:value-of select="REQUEST"/>
   </xsl:template>

</xsl:stylesheet>

你好
请在结账前付账
标签是
请求是

您不必使用*:nodeset()函数来执行此操作,请参阅:关于“名称空间的非常规使用”,ja!除此之外,使用XSLT名称空间作为默认名称空间并不是非常规的,在您的回答中,您使用的是字符串值。这就是为什么您不处理内联数据的典型名称空间问题:尽管它可能位于空名称空间下(父名称空间位于非空名称空间下),但所有范围内的名称空间(可能在
样式表
元素中声明)都存在。只有使用XML1.1,才能将这些名称空间声明重置为
xmlns:xsl=”“
。我应该说“非常规使用XSLT名称空间作为默认名称空间”,真的-您的示例是我第一次看到有人这样做。也就是说,我不理解您关于“典型名称空间问题”的观点。这是什么问题?
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:in="urn:inline-data"
    exclude-result-prefixes="in"
>

   <in:TEXT_CONTENT_ENG>
      <STATIC_TEXT> 
         <LABEL>Hello</LABEL>
         <REQUEST>Please pay your bill before </REQUEST>
      </STATIC_TEXT>
   </in:TEXT_CONTENT_ENG>

   <xsl:template match="/">
      <output>
         <xsl:apply-templates 
             select="document('')/xsl:stylesheet/in:TEXT_CONTENT_ENG/*"/>
      </output>
   </xsl:template>

   <xsl:template match="STATIC_TEXT">
      <xsl:text>The label is </xsl:text>
      <xsl:value-of select="LABEL"/>
      <xsl:text> and the request is </xsl:text>
      <xsl:value-of select="REQUEST"/>
   </xsl:template>

</xsl:stylesheet>