1

私のプロジェクトには次のXML構造があります。フラットな構造を作るために、繰り返しノードを転置する何かを書く必要があります

<bookstore>
  <book >
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book >
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book>
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

このように構造を平らにしたい

<bookstore>

    <bookonetitle lang="en">Everyday Italian</bookonetitle>
    <bookoneauthor>Giada De Laurentiis</bookoneauthor>
    <bookoneyear>2005</bookoneyear>
    <bookoneprice>30.00</bookoneprice>


    <booktwotitle lang="en">Harry Potter</booktwotitle>
    <booktwoauthor>J K. Rowling</booktwoauthor>
    <booktwoyear>2005</booktwoyear>
    <booktwoprice>29.99</booktwoprice>

    <bookthreetitle lang="en">Learning XML</bookthreetitle>
    <bookthreetitle>Erik T. Ray</bookthreetitle>
    <bookthreetitle>2003</bookthreetitle>
    <bookthreetitle>39.95</bookthreetitle>



</bookstore>
4

2 に答える 2

3

あなたの出力構造は非常に厄介だと私は思います。あなたはそれを再考したいかもしれません。しかし、いずれにせよ、このXSLT1.0スタイルシート...

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

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

<xsl:template match="book">
  <xsl:apply-templates select="node()"/>
</xsl:template>

<xsl:template match="book/*">
  <xsl:element name="book-{count(../preceding-sibling::book)+1}-{local-name()}">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>

</xsl:stylesheet>

...サンプル入力を...に変換します

<bookstore>
  <book-1-title lang="en">Everyday Italian</book-1-title>
  <book-1-author>Giada De Laurentiis</book-1-author>
  <book-1-year>2005</book-1-year>
  <book-1-price>30.00</book-1-price>
  <book-2-title lang="en">Harry Potter</book-2-title>
  <book-2-author>J K. Rowling</book-2-author>
  <book-2-year>2005</book-2-year>
  <book-2-price>29.99</book-2-price>
  <book-3-title lang="en">Learning XML</book-3-title>
  <book-3-author>Erik T. Ray</book-3-author>
  <book-3-year>2003</book-3-year>
  <book-3-price>39.95</book-3-price>
</bookstore> 
于 2012-09-12T16:22:09.423 に答える
1

Michael Kayのコメントによると、最善のオプションはXSLT2.0命令を使用することです。

<xsl:number value="$n" format="w"/>

ただし、XSLT 2.0を使用できず、書籍の数が制限されており、制限が事前にわかっている場合は、次のようなソリューションを使用できます。

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

 <my:numbers>
   <num>one</num>
   <num>two</num>
   <num>three</num>
   <num>four</num>
   <num>five</num>
   <num>six</num>
   <num>seven</num>
   <num>eight</num>
   <num>nine</num>
   <num>ten</num>
   <num>eleven</num>
   <num>twelve</num>
 </my:numbers>

 <xsl:variable name="vNumbers" select="document('')/*/my:numbers/*"/>

 <xsl:template match="/*">
  <bookstore><xsl:apply-templates/></bookstore>
 </xsl:template>
 <xsl:template match="book">
  <xsl:apply-templates select="*">
   <xsl:with-param name="pPos" select="position()"/>
  </xsl:apply-templates>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="book/*">
   <xsl:param name="pPos"/>

   <xsl:element name="book{$vNumbers[$pPos]}{name()}">
     <xsl:copy-of select="@*|node()"/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<bookstore>
  <book >
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book >
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book>
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

必要な正しい結果が生成されます:

<bookstore>
   <bookonetitle lang="en">Everyday Italian</bookonetitle>
   <bookoneauthor>Giada De Laurentiis</bookoneauthor>
   <bookoneyear>2005</bookoneyear>
   <bookoneprice>30.00</bookoneprice>

   <booktwotitle lang="en">Harry Potter</booktwotitle>
   <booktwoauthor>J K. Rowling</booktwoauthor>
   <booktwoyear>2005</booktwoyear>
   <booktwoprice>29.99</booktwoprice>

   <bookthreetitle lang="en">Learning XML</bookthreetitle>
   <bookthreeauthor>Erik T. Ray</bookthreeauthor>
   <bookthreeyear>2003</bookthreeyear>
   <bookthreeprice>39.95</bookthreeprice>

</bookstore>
于 2012-09-13T03:46:30.740 に答える