使用xml作为xsl变量

时间:2010-10-20 07:20:56

标签: 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 </REQUEST>
  </STATIC_TEXT>
</xsl:variable>

最后,我可以使用这些变量两次应用创建的模板。

xsl似乎使用给定变量进行验证,但我无法将模板应用于该xml。尝试过并且文档($ TEXT_CONTENT_ENG)也没有用。

这是否可行以及如何做?

3 个答案:

答案 0 :(得分:1)

  

两个街区中的大部分文字都是   静态

如果这是真的,那么正确的XSLT方式是内联数据。来自http://www.w3.org/TR/xslt#stylesheet-element

  

另外,xsl:stylesheet   元素可以包含任何元素   从XSLT名称空间,提供   元素的扩展名有一个   非空名称空间URI。存在   这些顶级元素不得   更改XSLT元素的行为   和在此定义的功能   文献;例如,它不会   允许这样的顶级元素   指定xsl:apply-templates   是使用不同的规则来解决   冲突。因此,XSLT处理器就是   总是可以自由地忽略这样的顶级   元素,必须忽略顶级   如果它没有给出错误的元素   无法识别名称空间URI。   这些元素可以提供   例如,

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

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

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

  •   
  • 有关样式表的元数据,

  •   
  • 样式表的结构化文档。

  •   
<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">
    <variable name="vRTF">
        <STATIC_TEXT xmlns="">
            <LABEL>Hello</LABEL>
            <REQUEST>Please pay your bill before </REQUEST>
        </STATIC_TEXT>
    </variable>
    <template match="/">
        <apply-templates
              select="document('')/*/xsl:variable[@name='vRTF']/node()"
              xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
    </template>
    <template match="@*|node()">
        <copy>
            <apply-templates select="@* | node()"/>
        </copy>
    </template>
</stylesheet>

输出:

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

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

答案 1 :(得分:1)

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>

答案 2 :(得分:0)

使用xalan我能够这样做:

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

exslt

也可以使用类似的功能