2014-03-06 194 views
0

我试图将此分层Web服务结果集转换为表格格式。我试图抓住以下几点:XSLT选择通过动态父节点的子节点

  • START_TIME

  • END_TIME

  • 的web_url

  • scheduled_report_id

的问题是,<versions>下的节点,在这个c ase <_1794050>是动态的,并随着每个<results>而改变,所以在我的XSD中,我将其作为any。我愿意对我的模式定义进行修改,或者对如何通过XSLT访问它有所帮助,但目前我无法更改输入格式。

输入XML

<?xml version="1.0" encoding="UTF-8"?><wrap> 
    <total>4259</total> 
    <query> 
    <start>91</start> 
    <end>100</end> 
    </query> 
    <results> 
    <public_id>jx6t3sfnelq2bpzpvmeg8i74zv7gc5</public_id> 
    <name>Facebook Post Insights Report</name> 
    <start_time>2014-02-23T01:00:00-05:00</start_time> 
    <end_time>2014-03-02T00:59:59-05:00</end_time> 
    <created_at>2014-03-04T03:03:52-05:00</created_at> 
    <versions> 
     <_1794050> 
     <web_url>https://URLHERE.com</web_url> 
     <excel_url>https://URLHERE.com</excel_url> 
     <data_url>https://URLHERE.com</data_url> 
     </_1794050> 
    </versions> 
    <scheduled_report_id>6303</scheduled_report_id> 
    </results> 
</wrap> 

XSD架构

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified"> 
    <xs:element name="wrap"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element type="xs:short" name="total"/> 
     <xs:element name="query"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element type="xs:byte" name="start"/> 
       <xs:element type="xs:byte" name="end"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="results" maxOccurs="unbounded" minOccurs="0"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element type="xs:string" name="public_id"/> 
       <xs:element type="xs:string" name="name"/> 
       <xs:element type="xs:dateTime" name="start_time"/> 
       <xs:element type="xs:dateTime" name="end_time"/> 
       <xs:element type="xs:dateTime" name="created_at"/> 
       <xs:element name="versions"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:any/> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element type="xs:string" name="scheduled_report_id"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

XSLT到目前为止...

<xslt:stylesheet xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:csw-xform="http://www.compositesw.com/2003/xform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xslt:template match="/"> 
    <xslt:variable name="_public_id"/> 
    <xslt:variable name="_start_time"/> 
    <xslt:variable name="_end_time"/> 
    <xslt:variable name="_created_at"/> 
    <xslt:variable name="_scheduled_report_id"/> 
    <xslt:element name="results"> 
     <xslt:for-each select="wrap"> 
     <xslt:for-each select="results"> 
      <xslt:variable name="_public_id" select="public_id"/> 
      <xslt:variable name="_start_time" select="start_time"/> 
      <xslt:variable name="_end_time" select="end_time"/> 
      <xslt:variable name="_created_at" select="created_at"/> 
      <xslt:variable name="_scheduled_report_id" select="scheduled_report_id"/> 
      <xslt:element name="result"> 
      <xslt:element name="public_id"> 
       <xslt:value-of select="$_public_id"/> 
      </xslt:element> 
      <xslt:element name="start_time"> 
       <xslt:value-of select="$_start_time"/> 
      </xslt:element> 
      <xslt:element name="end_time"> 
       <xslt:value-of select="$_end_time"/> 
      </xslt:element> 
      <xslt:element name="created_at"> 
       <xslt:value-of select="$_created_at"/> 
      </xslt:element> 
      <xslt:element name="scheduled_report_id"> 
       <xslt:value-of select="$_scheduled_report_id"/> 
      </xslt:element> 
      </xslt:element> 
     </xslt:for-each> 
     </xslt:for-each> 
    </xslt:element> 
    </xslt:template> 
</xslt:stylesheet> 
+0

添加迄今为止编写的XSLT比架构更重要。这是因为您可以将未知元素与'*'匹配(如'versions/*/web_url')。 –

+0

添加了迄今为止我所使用的XSLT。 – dreyco676

回答

1

随着versions/*/web_url例如

<xsl:template match="results"> 
    <xsl:value-of select="versions/*/web_url"/> 
</xsl:template> 

你可以读出web_url孩子versions元素的任意子节点的results元素作为上下文节点的内部。或者您可以使用versions//web_url访问任何web_url后代。

正如你现在已经添加了一些XSLT的<xslt:for-each select="results">里面你可以使用<xslt:variable name="web_url" select="versions/*/web_url"/>,然后输出同样的方式为您与其他变量进行,或者我会做,只是用文字结果元素<web_url><xslt:value-of select="$web_url"/></web_url>。当然你甚至不需要变量,但可以使用<web_url><xslt:value-of select="versions/*/web_url"/></web_url>

+0

呵呵,谢谢。我真的很担心我必须定义父节点。这很好。 – dreyco676