2010-10-20 1 views
0

Мне нужно создать слегка динамический pdf (две переменные) с двумя текстовыми блоками на разных языках.using xml as xsl variable

Большая часть текста в обоих блоках статична

Я думаю, если я мог бы создать один шаблон, который позволит создать 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

Вы не должны использовать *: набор узлов() функцию, чтобы сделать это, см: http://stackoverflow.com/questions/3626118/xslt-creation-a-map-in-xslt/3626283 –

1

Большая часть текста в обоих блоков статический

Если это так, то правильный способ XSLT - это встроенные данные. От http://www.w3.org/TR/xslt#stylesheet-element

В Кроме того, XSL: Элемент таблицы стилей может содержать любой элемент не из пространства имен 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

Ответ Алехандро в целом правильный, но нетрадиционное использование пространств имен немного запутанно, и он обертывает данные ненужным элементом 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> 
+0

Об «нетрадиционном использовании пространств имен», ja! Кроме того, использование пространства имен XSLT в качестве пространства имен по умолчанию не является нетрадиционным, в вашем ответе вы используете строковые значения. Вот почему вы не имеете дело с типичной проблемой пространства имен с встроенными данными: несмотря на то, что он может находиться под пустым пространством имен (с родителем под непустым пространством имен), все в пространствах пространств имен (может быть объявлено в элементе 'stylesheet') здесь. Только с XML 1.1 вы можете сбросить эти объявления пространства имен как 'xmlns: xsl =" "'. – 2010-10-20 21:14:59

+0

Я должен был сказать «нетрадиционное использование пространства имен XSLT как по умолчанию», на самом деле - ваш пример буквально в первый раз, когда я когда-либо видел, что кто-то это делает. Тем не менее, я не понимаю, что вы делаете о «типичной проблеме пространства имен». Какая проблема? –