【问题标题】:using xml as xsl variable使用 xml 作为 xsl 变量
【发布时间】:2010-10-20 07:20:56
【问题描述】:

我必须用两个不同语言的文本块创建稍微动态的 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) 也没有用。

这是否可能以及如何做到这一点?

【问题讨论】:

    标签: xml xslt xsl-fo xalan


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

    【讨论】:

      【解决方案2】:

      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>
      

      【讨论】:

      • 关于“非常规地使用命名空间”,ja!除此之外,使用 XSLT 命名空间作为默认命名空间并非不合常规,在您的回答中,您使用的是字符串值。这就是为什么您没有使用内联数据处理典型的命名空间问题:尽管它可能位于 null 命名空间下(父级位于非 null 命名空间下),但都在作用域命名空间中(可能在 stylesheet 元素中声明)在那里。只有使用 XML 1.1,您才能将这些命名空间声明重置为 xmlns:xsl=""
      • 我应该说“非常规地使用 XSLT 命名空间作为默认值”,真的——你的例子是我第一次看到有人这样做。也就是说,我不明白您对“典型的命名空间问题”的看法。这是什么问题?
      【解决方案3】:

      使用 xalan 我可以这样做:

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

      exslt也有类似的功能

      【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多