2013-03-18 2 views
-1

Я новичок в xslt, и мне нелегко пытаться выяснить, как преобразовать следующий xml. Я знаю, что мне нужно перебирать строки, но я не знаю, как преобразовать имена столбцов в элементы. Любая помощь будет оценена.Как преобразовать набор данных в xml с помощью xslt

Это XML-получил от WebService

<?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> 

Спасибо заранее !!! Марсело

ответ

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> 
+0

JLRishe, Вы так много для ответ!!! Это именно то, что я искал ... – mcampos

Смежные вопросы