2016-12-15 129 views
0

我正在使用Banxico Web服務,它返回一個字符串,在該字符串中有XML。如何將字符串xml轉換爲XML節點XSLT

我真正需要的是使用XSLT或XPath提取下一部分。

怎樣才能使用XSLT或Xpath?

Pesos pordólarE.U.A. TIPO德坎比奧第solventar obligaciones denominadas烯莫內達extranjera出生日期解determinación(FIX)」 IDSERIE = 「SF43718」 BANXICO_FREQ = 「直徑」 BANXICO_FIGURE_TYPE = 「TipoCambio」 BANXICO_UNIT_TYPE = 「PesoxDoll」>

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Header> 
     <X-OPNET-Transaction-Trace:X-OPNET-Transaction-Trace soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xsi:type="soapenc:string" xmlns:X-OPNET-Transaction-Trace="http://opnet.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">pid=4468,requestid=4d0ce60a-c92f-441e-87b1-4c6f12b26574</X-OPNET-Transaction-Trace:X-OPNET-Transaction-Trace> 
    </soapenv:Header> 
    <soapenv:Body> 
     <ns1:tiposDeCambioBanxicoResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ws.dgie.banxico.org.mx"> 
     <result xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="ISO-8859-1"?> 
<CompactData xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message" 
xmlns:bm="http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact" 
xmlns:compact="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/compact" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message SDMXMessage.xsd 
http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact BANXICO_DGIE_SIE_Compact.xsd 
http://www.SDMX.org/resources/SDMXML/schemas/v1_0/compact SDMXCompactData.xsd" > 
    <Header> 
     <ID>TIPOSDECAMBIO</ID> 
     <Test>false</Test> 
     <Truncated>false</Truncated> 
     <Name xml:lang="sp">Tipos de Cambio</Name> 
     <Prepared>2016-12-15 12:26:37.766</Prepared> 
     <Sender id="BANXICO"> 
      <Name xml:lang="sp">Banco de México</Name> 
      <Contact> 
      <Name xml:lang="sp">Subgerencia de Desarrollo de Sistemas</Name> 
      <Telephone>(01 55)52372678</Telephone> 
      </Contact> 
     </Sender> 
     <DataSetAction>Update</DataSetAction> 
     <Extracted>2016-12-15 12:26:37.766</Extracted> 
    </Header> 
    <bm:DataSet> 
     <bm:SiblingGroup BANXICO_FREQ="Dia" TIME_FORMAT="P1D"/> 
     <bm:Series TITULO="Tipo de cambio pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de liquidación" IDSERIE="SF60653" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="PesoxDoll"> 
      <bm:Obs TIME_PERIOD="2016-12-15" OBS_VALUE="20.2567"/> 
     </bm:Series> 
     <bm:Series TITULO="Tipo de cambio           Pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de determinación (FIX)" IDSERIE="SF43718" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="PesoxDoll"> 
      <bm:Obs TIME_PERIOD="2016-12-15" OBS_VALUE="20.5973"/> 
     </bm:Series> 
     <bm:Series TITULO="Cotización de las divisas que conforman la canasta del DEG Respecto al peso mexicano Euro" IDSERIE="SF46410" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso"> 
      <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="21.535"/> 
     </bm:Series> 
     <bm:Series TITULO="Cotización de la divisa Respecto al peso mexicano Dólar Canadiense" IDSERIE="SF60632" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso"> 
      <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="15.4178"/> 
     </bm:Series> 
     <bm:Series TITULO="Cotización de las divisas que conforman la canasta del DEG Respecto al peso mexicano Yen japonés" IDSERIE="SF46406" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso"> 
      <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="0.176"/> 
     </bm:Series> 
     <bm:Series TITULO="Cotización de las divisas que conforman la canasta del DEG Respecto al peso mexicano Libra esterlina" IDSERIE="SF46407" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso"> 
      <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="25.5806"/> 
     </bm:Series> 
    </bm:DataSet> 
</CompactData>]]></result> 
     </ns1:tiposDeCambioBanxicoResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

有了這種反應我建立一個XSD架構。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="DataSet"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="SiblingGroup"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute type="xs:string" name="BANXICO_FREQ"/> 
       <xs:attribute type="xs:duration" name="TIME_FORMAT"/> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="Series" maxOccurs="unbounded" minOccurs="0"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Obs"> 
       <xs:complexType> 
        <xs:simpleContent> 
        <xs:extension base="xs:string"> 
         <xs:attribute type="xs:date" name="TIME_PERIOD" use="optional"/> 
         <xs:attribute type="xs:float" name="OBS_VALUE" use="optional"/> 
        </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute type="xs:string" name="TITULO" use="optional"/> 
      <xs:attribute type="xs:string" name="IDSERIE" use="optional"/> 
      <xs:attribute type="xs:string" name="BANXICO_FREQ" use="optional"/> 
      <xs:attribute type="xs:string" name="BANXICO_FIGURE_TYPE" use="optional"/> 
      <xs:attribute type="xs:string" name="BANXICO_UNIT_TYPE" use="optional"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+1

您可以使用哪種版本的XSLT或XPath?由於內部XML以CDATA節的形式轉義,因此需要兩個分析步驟,如果您想在純XSLT或XPath中執行此操作,則需要XSLT/XPath 3.0或支持擴展來解析XML的實現。 –

回答

2

要只運行一個XSL轉換來提取所需的信息,你不需要生成一個模式。

如果您可以使用XPath 3函數,您可以一次完成所有操作:XPath 3包含一個函數來解析字符串並將其轉換爲邏輯XML樹,從而允許您運行XPath表達式。

如果您不能使用XPath 3函數,那麼您需要兩次執行此操作:將<result>文本內容(要進一步處理的XML響應)導出到單獨的文件,然後加載該文件並對其執行另一次轉換以提取所需內容。

下面是如何使用XPath 3.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="3.0"> 

    <!-- Start at the document node/and set up the outermost element --> 
    <xsl:template match="/"> 
     <!-- Change this element name to whatever makes sense for you --> 
     <BanxicoReply> 
      <!-- The input file only has one "result", 
       and that's all we want, so grab it --> 
      <xsl:apply-templates select="//result"/> 
     </BanxicoReply> 
    </xsl:template> 

    <xsl:template match="result"> 
     <!-- Parse the CDATA content to turn it into XML --> 
     <xsl:variable name="contained-xml" select="parse-xml(./text())"/> 

     <!-- Do what you need to here. 
      This example just plucks out the one chunk 
      you identified at the top of your post. 

      Note the "*:Series" shorthand: this matches 
      any "Series" element in any namespace. This 
      is an admittedly sloppy shortcut, which could 
      be dangerous in other contexts - but here, in 
      this one file, it's safe, and this avoids the 
      need for us to explicitly declare the "bm:" 
      namespace prefix in this XSL. --> 
     <xsl:copy-of select="$contained-xml//*:Series[@IDSERIE='SF43718']"/> 
    </xsl:template> 

    <!-- Suppress output of all other elements --> 
    <xsl:template match="*"/> 

</xsl:stylesheet> 

使用上面的輸入,這個XSL產生以下結果你的XML在一個通處理此快速和骯髒的例子(縮進,以方便人易讀性):

<?xml version="1.0" encoding="UTF-8"?> 
<BanxicoReply> 
    <bm:Series xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message" 
     xmlns:bm="http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact" 
     xmlns:compact="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/compact" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     TITULO="Tipo de cambio           Pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de determinación (FIX)" 
     IDSERIE="SF43718" 
     BANXICO_FREQ="Dia" 
     BANXICO_FIGURE_TYPE="TipoCambio" 
     BANXICO_UNIT_TYPE="PesoxDoll"> 
     <bm:Obs TIME_PERIOD="2016-12-15" OBS_VALUE="20.5973"/> 
    </bm:Series> 
</BanxicoReply>