Новичку в XSL-преобразовании нужна помощь для выравнивания XML-файла. - PullRequest
1 голос
/ 13 августа 2010

Я пытаюсь преобразовать этот файл:

<?xml version="1.0" encoding="utf-8"?> 
<x12errors>  
  <header>  
    <errors>  
      <issue>  
        <message>Wrong value</message>  
        <path>path to bad value</path>  
      </issue>  
      <issue>  
        <message>Missing value</message>  
        <path>path where missing value should be</path>  
      </issue>  
    </errors>  
    <warnings>  
      <issue>  
        <message>Value too small</message>  
        <path>path to value</path>  
      </issue>  
    </warnings>  
  </header>  
  <boxes>  
    <box>  
      <boxName>cardboard</boxName>  
      <boxStyleNum>12345</boxStyleNum>  
      <errors>  
        <issue>  
          <message>Box too small</message>  
          <path>path to box size</path>  
        </issue>  
      </errors>  
      <warnings>  
        <issue>  
          <message>Box flaps off center</message>  
          <path>path to box measurements</path>  
        </issue>  
      </warnings>  
      <wrappings>  
        <wrapping>  
          <material>bubble wrap</material>
          <dimensions>9x12</dimensions>
          <errors>
            <issue>
              <message>Wrong material</message>
              <path>path</path>
            </issue>
          </errors>
          <warnings>
            <issue>
              <message>Prefer different color</message>
              <path>path to value</path>
            </issue>
          </warnings>
        </wrapping>
      </wrappings>
    </box>
  </boxes>
</x12errors>

в этот файл:

<?xml version="1.0" encoding="utf-8"?>
<x12errors>
  <header>
    <headerMsg><type>E</type><msgText>Wrong value</msgText></headerMsg>
    <headerMsg><type>E</type><msgText>Missing value</msgText></headerMsg>
    <headerMsg><type>W</type><msgText>Value too small</msgText></headerMsg>
  </header>
  <boxes>
    <box>
      <boxName>cardboard</boxName>
      <boxStyleNum>12345</boxStyleNum>
      <boxMsg><type>E</type><msgText>Box too small</msgText></boxMsg>
      <boxMsg><type>W</type><msgText>Box flaps off center</msgText></boxMsg>
      <wrappings>
        <wrapping>
          <material>bubble wrap</material>
          <dimensions>9x12</dimensions>
          <wrappingMsg><type>E</type><msgText>Wrong material</msgText></wrappingMsg>
          <wrappingMsg><type>E</type><msgText>Prefer different color</msgText></wrappingMsg>
        </wrapping>
      </wrappings>
    </box>
  </boxes>
</x12errors>

У меня есть следующий файл xsl, который близко, но он оставляет «ошибки»там есть "предупреждения", и я не могу понять, почему!Кто-нибудь может мне помочь?

Вот мой текущий xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" indent="no"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="header//errors/issue">
    <xsl:apply-templates select="message"/>
  </xsl:template>

  <xsl:template match="header//errors/issue/message">
    <headerMsg>
      <type>E</type>
      <xsl:element name="msgText">
        <xsl:apply-templates />
      </xsl:element>
    </headerMsg>
  </xsl:template>

  <xsl:template match="header/warnings/issue">
    <xsl:apply-templates select="message"/>
  </xsl:template>

  <xsl:template match="header//warnings/issue/message">
    <headerMsg>
      <type>W</type>
      <xsl:element name="msgText">
        <xsl:apply-templates />
      </xsl:element>
    </headerMsg>
  </xsl:template>

  <xsl:template match="boxs">
    <xsl:apply-templates select="box"/>
  </xsl:template>

  <xsl:template match="box/errors/issue">
    <xsl:apply-templates select="message"/>
  </xsl:template>

  <xsl:template match="box//errors/issue/message">
    <boxMsg>
      <xsl:apply-templates select="../../boxName"/>
      <xsl:apply-templates select="../../boxStyle"/>
      <type>E</type>
      <xsl:element name="msgText">
        <xsl:apply-templates />
      </xsl:element>
    </boxMsg>
  </xsl:template>

  <xsl:template match="box/warnings/issue">
    <xsl:apply-templates select="message"/>
  </xsl:template>

  <xsl:template match="box//warnings/issue/message">
    <boxMsg>
      <xsl:apply-templates select="../../boxName"/>
      <xsl:apply-templates select="../../boxStyle"/>
      <type>W</type>
      <xsl:element name="msgText">
        <xsl:apply-templates />
      </xsl:element>
    </boxMsg>
  </xsl:template>

  <xsl:template match="wrappings">
    <xsl:apply-templates select="wrapping"/>
  </xsl:template>

  <xsl:template match="wrapping/errors/issue">
    <xsl:apply-templates select="message"/>
  </xsl:template>

  <xsl:template match="wrapping//errors/issue/message">
    <wrappingMsg>
      <xsl:apply-templates select="../../material"/>
      <xsl:apply-templates select="../../dimensions"/>
      <type>E</type>
      <xsl:element name="msgText">
        <xsl:apply-templates />
      </xsl:element>
    </wrappingMsg>
  </xsl:template>

  <xsl:template match="wrapping/warnings/issue">
    <xsl:apply-templates select="message"/>
  </xsl:template>

  <xsl:template match="wrapping//warnings/issue/message">
    <wrappingMsg>
      <xsl:apply-templates select="../../material"/>
      <xsl:apply-templates select="../../dimensions"/>
      <type>W</type>
      <xsl:element name="msgText">
        <xsl:apply-templates />
      </xsl:element>
    </wrappingMsg>
  </xsl:template>


</xsl:stylesheet>

Спасибо!Laurie

Ответы [ 3 ]

2 голосов
/ 13 августа 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:m="message" exclude-result-prefixes="m">
    <m:header>
        <m:message type="E">Wrong value</m:message>
        <m:message type="E">Missing value</m:message>
        <m:message type="W">Value too small</m:message>
    </m:header>
    <m:box>
        <m:message type="E">Box too small</m:message>
        <m:message type="W">Box flaps off center</m:message>
    </m:box>
    <m:wrapping>
        <m:message type="E">Wrong material</m:message>
        <m:message type="E">Prefer different color</m:message>
    </m:wrapping>
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="path"/>
    <xsl:template match="errors|warnings|issue">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="message">
        <xsl:element name="{local-name(../../..)}Msg">
            <type>
                <xsl:value-of select="document('')/*/m:*[local-name()=local-name(current()/../../..)]/*[.=current()]/@type"/>
            </type>
            <msgText>
                <xsl:value-of select="."/>
            </msgText>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<x12errors>
    <header>
        <headerMsg>
            <type>E</type>
            <msgText>Wrong value</msgText>
        </headerMsg>
        <headerMsg>
            <type>E</type>
            <msgText>Missing value</msgText>
        </headerMsg>
        <headerMsg>
            <type>W</type>
            <msgText>Value too small</msgText>
        </headerMsg>
    </header>
    <boxes>
        <box>
            <boxName>cardboard</boxName>
            <boxStyleNum>12345</boxStyleNum>
            <boxMsg>
                <type>E</type>
                <msgText>Box too small</msgText>
            </boxMsg>
            <boxMsg>
                <type>W</type>
                <msgText>Box flaps off center</msgText>
            </boxMsg>
            <wrappings>
                <wrapping>
                    <material>bubble wrap</material>
                    <dimensions>9x12</dimensions>
                    <wrappingMsg>
                        <type>E</type>
                        <msgText>Wrong material</msgText>
                    </wrappingMsg>
                    <wrappingMsg>
                        <type>E</type>
                        <msgText>Prefer different color</msgText>
                    </wrappingMsg>
                </wrapping>
            </wrappings>
        </box>
    </boxes>
</x12errors>

РЕДАКТ. 1 : лучшее объяснение. Примечание : «Идентификационное преобразование» (шаблон [@ name = 'idenity']) просто копирует исходный источник как есть.Некоторые элементы обойдены (не копируйте, а применяйте шаблоны к дочерним элементам): errors, warnings и issue.path элемент чередуется с пустым шаблоном.Встроенная карта: document('') вычисление в корне документа таблицы стилей;элементы верхнего уровня в другом пространстве имен, чем пространство имен XSLT, игнорируются процессором, но мы можем выбрать их (в этом случае те, которые имеют локальное имя, равное message локальному имени деда, затем потомки из тех, которые имеютстроковое значение, равное message строковое значение, и, наконец, их type атрибут)

0 голосов
/ 26 октября 2010

Маленький совет :). Если у вас есть какой-либо XML с собственным XSL, вы можете использовать XEP, чтобы проверить, соответствуют ли они друг другу, иначе он покажет вам ваши ошибки ... Подробнее о XEP вы можете посетить на форуме http://cooltools.renderx.com/viewtopic.php?f=14&t=4

0 голосов
/ 13 августа 2010

Я думаю, что вы «просите» все узлы в начале. Вы собираетесь получить много оригинальных вещей. Просто удалив это в вашем XSLT:

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

Я мог бы получить вывод:

<?xml version="1.0" encoding="utf-8"?>  
<headerMsg><type>E</type><msgText>Wrong value</msgText></headerMsg>  
<headerMsg><type>E</type><msgText>Missing value</msgText></headerMsg>  
<headerMsg><type>W</type><msgText>Value too small</msgText></headerMsg>  
        cardboard  
        12345  
        <boxMsg><type>E</type><msgText>Box too small</msgText></boxMsg>  
        <boxMsg><type>W</type><msgText>Box flaps off center</msgText></boxMsg>  
        bubble wrap
        9x12
        <wrappingMsg><type>E</type><msgText>Wrong material</msgText></wrappingMsg>
        <wrappingMsg><type>W</type><msgText>Prefer different color</msgText></wrappingMsg>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...