XSLT для преобразования XML в текст - PullRequest
4 голосов
/ 10 января 2012

У меня есть требование, когда мне нужно сгенерировать текстовый файл из XML-документа, сгенерированный текстовый файл должен быть в каком-то определенном формате, основанном на некоторых правилах.Мой XML выглядит примерно так:

<info>
 <Tag1>
  <Tag2>
   <Tag3>
    <PartNo>12 </PartNo>
   </Tag3>
   <DBOMInf1> 111 </DBOMInf1>
   <DBOMInf2> sring </DBOMInf2>
   </Tag2>
   <Tag2>
    <Tag3>
     <PartNo>12 </PartNo>
    </Tag3>
    <DBOMInf1> 555 </DBOMInf1>
    <DBOMInf2> abcd </DBOMInf2>
   </Tag2>
  </Tag1>
  <Tag4>
   <Tag5>
    <Description>1200 liter </Description>
    <No>12</No>
    <Name>Engine</Name>
    <Id>700</Id>
   </Tag5>
  </Tag4>
  <action>
   <actionId>700</actionId>
  </action>
</info>
  • Ожидаемый формат вывода в тексте:

ACTIONID | NO | ОПИСАНИЕ | ИМЯ | DBOMInf1 | DBOMInf2 700 | 12 | Engine| 1200 литров |111 | sring 700 | 12 | Двигатель | 1200 литров |555 | abcd

Я новичок в программировании XSLT. Может ли кто-нибудь поделиться информацией или примером того, как мне этого добиться, я знаком с основами сопоставления шаблонов XSLT, значением select.

Любая ссылка или пример будут очень полезны.Спасибо

1 Ответ

9 голосов
/ 10 января 2012

Похоже, вам нужна строка для каждого элемента Tag2 , и в этом случае их легко сопоставить, выполнив следующее (при условии, что в данный момент вы находитесь на элементе info * 1005). *

<xsl:apply-templates select="Tag1/Tag2" />

Но похоже, что вы хотите найти информацию из Tag5 элементов. В этом случае вы можете использовать ключ для поиска таких значений на основе элемента No . Ключ будет определен следующим образом:

<xsl:key name="Tags" match="Tag5" use="No" />

И чтобы найти теги для данного элемента Tag2 , вы можете сделать следующее:

<xsl:apply-templates select="key('Tags', normalize-space(Tag3/PartNo))" />

(Обратите внимание, нормализовать-пробел с удалением лишнего пробела из элемента)

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="text" indent="yes"/>
   <xsl:key name="Tags" match="Tag5" use="No" />

   <xsl:template match="/info">
      <xsl:text>ACTIONID|NO|DESCRIPTION|NAME|DBOMInf1|DBOMInf2</xsl:text>
      <xsl:value-of select="'&#13;'" />
      <xsl:apply-templates select="Tag1/Tag2" />
   </xsl:template>

   <xsl:template match="Tag2">
      <xsl:apply-templates select="key('Tags', normalize-space(Tag3/PartNo))" />
      <xsl:value-of select="concat(DBOMInf1, '|', DBOMInf2, '&#13;')" />
   </xsl:template>

   <xsl:template match="Tag5">
      <xsl:value-of select="concat(Id, '|', No, '|', Name, '|', Description, '|')" />
   </xsl:template>
</xsl:stylesheet>

При применении к вашему входному XML выводится следующий текст

ACTIONID|NO|DESCRIPTION|NAME|DBOMInf1|DBOMInf2
700|12|Engine|1200 liter | 111 | sring 
700|12|Engine|1200 liter | 555 | abcd 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...