Как использовать XSLT для преобразования простого куска XML - PullRequest
1 голос
/ 27 мая 2011

Как можно преобразовать

<person>
   <personFirstName>FirstName</personFirstName>
   <personLastName>LastName</personLastName>
   <personAge>40</personAge>
</person>

в

<person>
   <name>
      <first>FirstName</first>
      <last>LastName</last>
   </name>
   <age>40</age>
</person>

, используя XSLT, более того, если входной XML представляет собой набор узлов-людей, например:

<persons>
   <person>
       ...
   </person>
</persons>

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Это должно быть очень легко. Вы можете попробовать:

  • сопоставить person, затем открыть name, применить шаблоны, закрыть name, открыть age, получить значение из personAge, закрыть age
  • совпадение personFirstName, открытие first, получение значения, закрытие first
  • То же, что и personFirstName для personLastName

Я думаю, что 3 шаблона без циклов должно быть достаточно. Попробуйте!

1 голос
/ 27 мая 2011

Ключ - это преобразование идентичности и его переопределение при необходимости.

Пример XML

<persons>
  <person>
    <personFirstName>FirstName</personFirstName>
    <personLastName>LastName</personLastName>
    <personAge>40</personAge>
  </person>
  <person>
    <personFirstName>FirstName2</personFirstName>
    <personLastName>LastName2</personLastName>
    <personAge>100</personAge>
  </person>
</persons>

Образец XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="person">
    <person>
      <name>
        <first><xsl:apply-templates select="personFirstName"/></first>
        <last><xsl:apply-templates select="personLastName"/></last>
      </name>
      <age><xsl:apply-templates select="personAge"/></age>
    </person>
  </xsl:template>

  <xsl:template match="personFirstName|personLastName|personAge">
    <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>

OUTPUT

<persons>
   <person>
      <name>
         <first>FirstName</first>
         <last>LastName</last>
      </name>
      <age>40</age>
   </person>
   <person>
      <name>
         <first>FirstName2</first>
         <last>LastName2</last>
      </name>
      <age>100</age>
   </person>
</persons>
0 голосов
/ 28 мая 2011

Решение "push-style" :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="personFirstName">
  <name>
   <xsl:apply-templates mode="renameWrapped"
        select=".|../personLastName"/>
  </name>
 </xsl:template>

 <xsl:template match="personFirstName" mode="renameWrapped">
  <first><xsl:apply-templates/></first>
 </xsl:template>

 <xsl:template match="personLastName" mode="renameWrapped">
  <last><xsl:apply-templates/></last>
 </xsl:template>

 <xsl:template match="personAge">
  <age><xsl:apply-templates/></age>
 </xsl:template>
 <xsl:template match="personLastName"/>
</xsl:stylesheet>

при применении к этому документу XML :

<persons>
    <person>
        <personFirstName>FirstName</personFirstName>
        <personLastName>LastName</personLastName>
        <personAge>40</personAge>
    </person>
    <person>
        <personFirstName>FirstName2</personFirstName>
        <personLastName>LastName2</personLastName>
        <personAge>100</personAge>
    </person>
</persons>

желаемый, правильный результат получается :

<persons>
   <person>
      <name>
         <first>FirstName</first>
         <last>LastName</last>
      </name>
      <age>40</age>
   </person>
   <person>
      <name>
         <first>FirstName2</first>
         <last>LastName2</last>
      </name>
      <age>100</age>
   </person>
</persons>

Объяснение:

  1. Использование и переопределение правила / шаблона идентификации дляобтекание и переименование элементов.

  2. Элементы для обтекания переименовываются в режиме renameWrapped.

  3. Элемент personAge переименован в немодированный шаблон , который переопределяет правило идентификации для элементов с именем personAge.

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