-1

私はxsltの初心者であり、次のxmlを変換する方法を理解するのに苦労しています。行を反復処理する必要があることはわかっていますが、列名を要素に変換する方法がわかりません。どんな助けでも大歓迎です。

これはWebサービスから受け取ったxmlです

<?xml version="1.0" encoding="utf-8" ?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
   <xmlns="http://www.someservice.com/webservices/">
    <GetResultsResult>
    <Columns>
      <WSColumn>
         <Name>triptype</Name> 
      </WSColumn>
      <WSColumn>
         <Name>description</Name> 
      </WSColumn>
      <WSColumn>
         <Name>id</Name> 
      </WSColumn>
    </Columns>
    <Rows>
      <WSRow>
        <Cell>
          <anyType xsi:type="xsd:string">vacation</anyType> 
          <anyType xsi:type="xsd:string">Trip to Bahamas</anyType> 
          <anyType xsi:type="xsd:int">89</anyType> 
        </Cell>
       </WSRow>
       <WSRow>
        <Cell>
          <anyType xsi:type="xsd:string">vacation</anyType> 
          <anyType xsi:type="xsd:string">Trip to California</anyType> 
          <anyType xsi:type="xsd:int">75</anyType> 
         </Cell>
        </WSRow>
        <WSRow>
         <Cell>
           <anyType xsi:type="xsd:string">business</anyType> 
           <anyType xsi:type="xsd:string">Trip to Chicago</anyType> 
           <anyType xsi:type="xsd:int">82</anyType> 
          </Cell>
         </WSRow>
       </Rows>
       <HasErrors>false</HasErrors> 
       <ErrorMessage /> 
        </GetResultsResult>
      </GetResultsResponse>
    </soap:Body>
</soap:Envelope>

これは、変換後の望ましい結果です

<Trips>
   <Trip>
     <triptype>vacation</triptype>
     <description>Trip to Bahamas</description>
     <id>89</id> 
    </Trip>
    <Trip>
      <triptype>vacation</triptype>
      <description>Trip to California</description>
      <id>75</id>
     </Trip>
     <Trip>
       <triptype>business</triptype>
       <description>Trip to Bahamas</description>
       <id>82</id>
     </Trip>
</Trips>

前もって感謝します!!!マルセロ

4

1 に答える 1

1

これはそれを行う必要があります:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:gr="http://www.someservice.com/webservices/"
                exclude-result-prefixes="gr">

  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="kColumn" match="gr:WSColumn/gr:Name"
           use="count(../preceding-sibling::gr:WSColumn) + 1" />

  <xsl:template match="text()" />

  <xsl:template match="/">
    <Trips>
      <xsl:apply-templates />
    </Trips>
  </xsl:template>

  <xsl:template match="gr:WSRow/gr:Cell">
    <Trip>
      <xsl:apply-templates select="*"/>
    </Trip>
  </xsl:template>

  <xsl:template match="gr:Cell/*">
    <xsl:element name="{key('kColumn', position())}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると(壊れたGetResultsResponseタグが修正された後)、次のようになります。

<Trips>
  <Trip>
    <triptype>vacation</triptype>
    <description>Trip to Bahamas</description>
    <id>89</id>
  </Trip>
  <Trip>
    <triptype>vacation</triptype>
    <description>Trip to California</description>
    <id>75</id>
  </Trip>
  <Trip>
    <triptype>business</triptype>
    <description>Trip to Chicago</description>
    <id>82</id>
  </Trip>
</Trips>
于 2013-03-18T20:05:07.113 に答える