2010-10-20 75 views
0

我必須用兩種不同語言的文本塊創建稍微動態的pdf(兩個變量)。使用xml作爲xsl變量

大部分兩個塊的文字是靜態

我在想,如果我可以創建一個能夠創建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)都沒有工作。

這是甚至可能的,以及如何做到這一點?

回答

0

使用xalan的我能做到這一點是這樣的:

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

類似的功能也可用於EXSLT

+1

您不必使用*:然後您可以通過使用document(''),返回當前XSLT文件訪問節點集()函數來做到這一點,請參閱:http://stackoverflow.com/questions/3626118/xslt-creating-a-map-in-xslt/3626283 – 2010-10-20 10:23:43

1

大多數文本的兩個塊是 靜態

如果這是真的,那麼正確的XSLT方式就是內嵌數據。從http://www.w3.org/TR/xslt#stylesheet-element

此外,在xsl:樣式表 元件可以包含從XSLT命名空間的任何元件不 ,其前提是 的元素的擴展名具有 非空的命名空間URI。這種頂級元素的存在 不得改變 和此 文檔中定義的函數的行爲;例如,不允許 這樣的頂級元素 指定xsl:apply-templates 是使用不同規則來解決 衝突。因此,如果 不能識別名稱空間URI,則XSLT處理器始終可以自由忽略此類頂級 元素,並且必須忽略頂級 元素而不會給出錯誤。 這樣的元件可以提供, 例如,用於通過擴展元素或擴展函數(見
[14擴展])

  • 信息,

  • 信息有關如何處理結果樹做,

  • 有關如何獲取源代碼樹的信息,

  • 元AB出樣式表,

  • 樣式表的結構化文檔。

<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

Alejandro的回答總體上是正確的,但非常規名稱空間的使用有點令人困惑,他將數據封裝在一個不必要的xsl:variable元素中,這也有點令人困惑。

只要你把你的元素放在它自己的命名空間中,就可以使它成爲xsl:stylesheet元素的子元素。

<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> 
+0

關於「非常規名稱空間的使用」,ja!除了將XSLT命名空間視爲默認名稱空間並非非常規外,在您的答案中,您正在使用字符串值。這就是爲什麼你沒有用內聯數據處理典型的命名空間問題:儘管它可能在空命名空間下(父類在非空命名空間下),所有都在作用域命名空間中(可能在'stylesheet'元素中聲明)在那兒。只有使用XML 1.1,您纔可以將這些名稱空間聲明重置爲'xmlns:xsl =「」'。 – 2010-10-20 21:14:59

+0

我應該說「非常規地使用XSLT命名空間作爲默認值」,真的 - 您的例子實際上是我第一次見到任何人這樣做。也就是說,我不明白你對「典型名稱空間問題」所提出的觀點。那是什麼問題? – 2010-10-21 16:36:23