xslt динамическое значение - PullRequest
3 голосов
/ 17 июня 2011

Как создать динамическое значение?

Это так:

1) Мы получаем XML-экспорт из системы A.
2) Мы выбираем иотформатировать некоторые данные, необходимые для системы B.
3) Одно из переданных полей необходимо объединить из нескольких элементов исходного XML.

Объединенные элементы можно настроить с помощьюклиент.

Итак, теперь у меня есть следующее:
XSLT для преобразования XML из системы A
Простой XML-файл конфигурации, где клиент может указать, какие поля он хочет объединить впоследовательный путь:

<items>
<field type="field">field1</field>
<field type="text">whatever the customer wants between the combined fields</field>
<field type="field">field2</field>
<field type="text">whatever the customer wants between/after the combined fields</field>
<field type="field">field3</field>
</items>

пример этого XML будет переводить в:

<field1>, <field2> and <field3> or <field1>+<field2>=<field3>

В моем xslt у меня есть это:

<xsl:variable name="configfile" select="document(myconfigxml.xml)"/>

Затем я использую xsltциклически перебирать типы полей и где @ type = 'field' Я хочу использовать значение поля для просмотра элемента исходного XML.

<xsl:template name="items">
    <xsl:param name="personElementFromSourceXml"/>
    <xsl:for-each select="$configfile/items/field">
        <xsl:choose>
            <xsl:when test="@type='field'">
                <xsl:value-of select="???"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

Что мне нужно будет набрать наместо ????В псевдо-xslt это будет $personElementFromSourceXml/value-of-<field1-2-3> Я пробовал несколько вещей, таких как concat ($ personElementFromSourceXml, '/', current ()), пробовал $ personElementFromSourceXml / current (), но они не работают.

Кроме того, небольшая проверка здравомыслия: является ли моя идея решения этой проблемы нормальным подходом или я нарушаю все правила в книге?Обратите внимание, я все еще новичок в xslt.

1 Ответ

0 голосов
/ 25 июня 2011

У вас есть правильная идея, а именно: выбрать элемент, содержание которого вы, с помощью значения его имени. Простите, если я неправильно понял ваш вопрос, но я интерпретировал файл 'items' как файл шаблона и предположил, что отдельный входной файл. Например. для файла конфигурации:

<items>
  <field type="text">Here are the contents of bark: </field>
  <field type="field">bark</field>
  <field type="text">Here are the contents of woof: </field>
  <field type="field">woof</field>
  <field type="text">The end of the line.
</field>
</items>

и для исходного файла:

<file>
  <woof>Woof! Woof!</woof>
  <meow>Meow.</meow>
  <bark>Bark! Bark!</bark>
</file>

Я адаптировал ваш код так:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:variable name="configfile" select="document('config.xml')"/>
  <xsl:variable name="srcfile" select="/"/>

  <xsl:template match="/">
    <xsl:for-each select="$configfile/items/field">
      <xsl:choose>
        <xsl:when test="@type='field'">
          <xsl:variable name="tagname" select="."/>
          <xsl:value-of select="$srcfile/descendant::*[local-name()=$tagname]"/>
          <xsl:text>
</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Поскольку xsl:for-each выполняет итерацию по $configfile/items/field, каждый элемент field становится узлом контекста, поэтому вам нужен способ явной ссылки на исходный файл, поэтому я назначаю его глобальной переменной. Я получаю этот вывод:

Here are the contents of bark: Bark! Bark!
Here are the contents of woof: Woof! Woof!
The end of the line.
...