xslt, как «сгладить» структуру тегов для неизвестного числа дочерних тегов - PullRequest
1 голос
/ 20 декабря 2010

Мой исходный файл выглядит так:

<x>
<names>
         <name>name1</name>
         <name>name2</name>
</names>
<codes>
         <code>code1</code>
         <code>code2</code>
</codes>
<stuff> stuff </stuff>
</x>

И я хотел бы преобразовать его, чтобы получить такой вывод:

<out>
<y>
    <name>name1</name>
    <code>code1</code>
    <stuff> stuff </stuff>
</y>
<y>
    <name>name2</name>
    <code>code2</code>
    <stuff> stuff </stuff>
</y>
</out>

Я не знаю номер имении теги кода в исходном файле, но я знаю, что число имен равно количеству кодов.

Пожалуйста, поделитесь некоторыми советами, как это сделать.

1 Ответ

2 голосов
/ 20 декабря 2010

Это преобразование :

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

 <xsl:template match="/*">
  <out>
   <xsl:apply-templates select="names/name"/>
  </out>
 </xsl:template>

 <xsl:template match="name">
  <xsl:variable name="vPos" select="position()"/>
  <y>
   <xsl:copy-of select="."/>
   <xsl:copy-of select=
     "../../codes/code[position()=$vPos]"/>
   <xsl:copy-of select="/*/stuff"/>
  </y>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу :

<x>
    <names>
        <name>name1</name>
        <name>name2</name>
    </names>
    <codes>
        <code>code1</code>
        <code>code2</code>
    </codes>
    <stuff> stuff </stuff>
</x>

создает искомое, правильный результат :

<out>
   <y>
      <name>name1</name>
      <code>code1</code>
      <stuff> stuff </stuff>
   </y>
   <y>
      <name>name2</name>
      <code>code2</code>
      <stuff> stuff </stuff>
   </y>
</out>
...