используя xml в качестве переменной xsl - PullRequest
0 голосов
/ 20 октября 2010

Мне нужно создать слегка динамичный 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 ]

1 голос
/ 20 октября 2010

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

Если это так, то правильным способом 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 голос
/ 20 октября 2010

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

Используя xalan, я смог сделать это так:

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

Аналогичная функция также доступна для exslt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...