0

我必须用两个不同语言的文本块创建稍微动态的 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。尝试过并且 document($TEXT_CONTENT_ENG) 也没有奏效。

这甚至可能吗?怎么做?

4

3 回答 3

1

两个块中的大部分文本都是静态的

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

此外,xsl:stylesheet 元素可以包含任何不来自 XSLT 名称空间的元素,前提是该元素的扩展名称具有非空名称空间 URI。此类顶级元素的存在不得改变本文档中定义的 XSLT 元素和函数的行为;例如,不允许这样的顶级元素指定 xsl:apply-templates 使用不同的规则来解决冲突。因此,XSLT 处理器总是可以自由地忽略此类顶级元素,并且如果它无法识别名称空间 URI,则必须忽略顶级元素而不给出错误。这些元素可以提供,例如,

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

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

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

  • 关于样式表的元数据,

  • 样式表的结构化文档。

<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 中,您只能重置默认命名空间。

于 2010-10-20T13:53:42.177 回答
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>
于 2010-10-20T16:41:07.547 回答
0

使用 xalan 我可以这样做:

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

类似的功能也可用于 exslt

于 2010-10-20T07:35:44.157 回答