2015-11-11 56 views
0

我想用XSLT將XML轉換爲一個可以導入Access輸入文件是:XML轉換爲一個可以導入Access

<?xml version="1.0" encoding="UTF-8"?> 
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<DatosGen> 
    <Vendedor> 
     <Nombre>Juan Garcia Sanchez</Nombre> 
     <Codigo>VE144</Codigo> 
    </Vendedor> 
    <Fecha>30-abr-2015</Fecha> 
</DatosGen> 
<Pedidos> 
    <Pedido> 
     <Cabecera> 
      <Numero>34</Numero> 
      <Fecha>28-abr-2015</Fecha> 
      <Cliente> 
       <Nombre>Antonio Lopez Martin</Nombre> 
       <Codigo>CL121</Codigo> 
      </Cliente> 
      <Portes>SI</Portes> 
     </Cabecera> 
     <Detalle> 
      <Linea> 
       <Articulo>Ar654</Articulo> 
       <Cantidad>12</Cantidad> 
       <Precio>2</Precio> 
      </Linea> 
      <Linea> 
       <Articulo>Ar670</Articulo> 
       <Cantidad>9</Cantidad> 
       <Precio>1.21</Precio> 
      </Linea> 
      <Linea> 
       <Articulo>Ar100</Articulo> 
       <Cantidad>2</Cantidad> 
       <Precio>3.45</Precio> 
      </Linea> 
      <Linea> 
       <Articulo>Ar999</Articulo> 
       <Cantidad>215</Cantidad> 
       <Precio>12.24</Precio> 
      </Linea>     
     </Detalle> 
    </Pedido> 
    <Pedido> 
     <Cabecera> 
      <Numero>35</Numero> 
      <Fecha>29-abr-2015</Fecha> 
      <Cliente> 
       <Nombre>Manuel Enriquez Sousa</Nombre> 
       <Codigo>CL160</Codigo> 
      </Cliente> 
      <Portes>NO</Portes> 
     </Cabecera> 
     <Detalle> 
      <Linea> 
       <Articulo>Ar003</Articulo> 
       <Cantidad>10</Cantidad> 
       <Precio>2.21</Precio> 
      </Linea> 
      <Linea> 
       <Articulo>Ar005</Articulo> 
       <Cantidad>8</Cantidad> 
       <Precio>1.28</Precio> 
      </Linea> 
      <Linea> 
       <Articulo>Ar100</Articulo> 
       <Cantidad>5</Cantidad> 
       <Precio>3.75</Precio> 
      </Linea> 
     </Detalle> 
    </Pedido> 
</Pedidos> 
</Document> 

輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot generated="2015-08-22T13:10:05" xmlns:od="urn:schemas-microsoft-com:officedata"> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>34</Pedido> 
    <Fecha>28-abr-2015</Fecha> 
    <Cliente>Antonio Lopez Martin</Cliente> 
    <idCliente>CL121</idCliente> 
    <Portes>SI</Portes> 
    <Articulo>Ar100</Articulo> 
    <Cantidad>5</Cantidad> 
    <Precio>3.75</Precio> 
</importarxml> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>34</Pedido> 
    <Fecha>28-abr-2015</Fecha> 
    <Cliente>Antonio Lopez Martin</Cliente> 
    <idCliente>CL121</idCliente> 
    <Portes>SI</Portes> 
    <Articulo>Ar005</Articulo> 
    <Cantidad>8</Cantidad> 
    <Precio>1.28</Precio> 
</importarxml> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>34</Pedido> 
    <Fecha>28-abr-2015</Fecha> 
    <Cliente>Antonio Lopez Martin</Cliente> 
    <idCliente>CL121</idCliente> 
    <Portes>SI</Portes> 
    <Articulo>Ar003</Articulo> 
    <Cantidad>10</Cantidad> 
    <Precio>2.21</Precio> 
</importarxml> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>34</Pedido> 
    <Fecha>28-abr-2015</Fecha> 
    <Cliente>Antonio Lopez Martin</Cliente> 
    <idCliente>CL121</idCliente> 
    <Portes>SI</Portes> 
    <Articulo>Ar999</Articulo> 
    <Cantidad>215</Cantidad> 
    <Precio>12.24</Precio> 
</importarxml> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>35</Pedido> 
    <Fecha>29-abr-2015</Fecha> 
    <Cliente>Manuel Enriquez Sousa</Cliente> 
    <idCliente>CL160</idCliente> 
    <Portes>No</Portes> 
    <Articulo>Ar100</Articulo> 
    <Cantidad>2</Cantidad> 
    <Precio>3.45</Precio> 
</importarxml> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>35</Pedido> 
    <Fecha>29-abr-2015</Fecha> 
    <Cliente>Manuel Enriquez Sousa</Cliente> 
    <idCliente>CL160</idCliente> 
    <Portes>No</Portes> 
    <Articulo>Ar670</Articulo> 
    <Cantidad>9</Cantidad> 
    <Precio>1.21</Precio> 
</importarxml> 
<importarxml> 
    <Vendedor>Juan Garcia Sanchez</Vendedor> 
    <idVendedor>VE144</idVendedor> 
    <FechaFichero>30-abr-2015</FechaFichero> 
    <Pedido>35</Pedido> 
    <Fecha>29-abr-2015</Fecha> 
    <Cliente>Manuel Enriquez Sousa</Cliente> 
    <idCliente>CL160</idCliente> 
    <Portes>No</Portes> 
    <Articulo>Ar654</Articulo> 
    <Cantidad>12</Cantidad> 
    <Precio>2</Precio> 
</importarxml> 
</dataroot> 

我的XSLT不Pedido出生日期ŸCliente工作:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
    <xsl:template match="/"> 
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2015-08-22T13:10:05"> 
     <xsl:for-each select="//Document/Pedidos/Pedido/Detalle/Linea"> 
     <xsl:sort select="//Cliente/Nombre" order="descending" /> 
     <importarxml> 
      <Vendedor> 
      <xsl:value-of select="//Vendedor/Nombre" /> 
      </Vendedor> 
      <idVendedor> 
      <xsl:value-of select="//Vendedor/Codigo" /> 
      </idVendedor> 
      <FechaFichero> 
      <xsl:value-of select="//DatosGen/Fecha" /> 
      </FechaFichero> 
      <Pedido> 
      <xsl:value-of select="//Cabecera/Numero" /> 
      </Pedido> 
      <Fecha> 
      <xsl:value-of select="//Cabecera/Fecha" /> 
      </Fecha> 
      <Cliente> 
      <xsl:value-of select="//Cabecera/Cliente/Nombre" /> 
      </Cliente> 
      <idCliente> 
      <xsl:value-of select="//Cabecera/Cliente/Codigo" /> 
      </idCliente> 
      <Portes> 
      <xsl:value-of select="//Cabecera/Portes" /> 
      </Portes> 
      <Articulo> 
      <xsl:value-of select="Articulo" /> 
      </Articulo> 
      <Cantidad> 
      <xsl:value-of select="Cantidad" /> 
      </Cantidad> 
      <Precio> 
      <xsl:value-of select="Precio" /> 
      </Precio> 
     </importarxml> 
     </xsl:for-each> 
    </dataroot> 
    </xsl:template> 
</xsl:stylesheet> 
+0

你能不能解釋一下什麼母鹿*不行*?請包括所需的輸出。 – Filburt

+0

我期望的輸出是我放的。 錯誤是我從第一個客戶端重複數據,但內容是正確的節點Linea – emiliove

回答

1

你沒有你的XPath引用正確的。

在您的<xsl:for-each>之內,除非您編寫絕對路徑(以/開頭的路徑),否則所有路徑都相對於<Linea>節點。這也是你的主要錯誤:絕對路徑沒有上下文,因此他們選擇了不同的節點。

與它會被要求先去了四個級別的相對路徑訪問供應商名稱:

<xsl:value-of select="../../../../DatosGen/Vendedor/Nombre" /> 

由於這是難以遵循,它更清晰使用ancestor軸:

<xsl:value-of select="ancestor::Document[1]/DatosGen/Vendedor/Nombre" /> 

但當然只有一個<DatosGen>在你的輸入,因此你可以使用絕對路徑,以及:

<xsl:value-of select="/Document/DatosGen/Vendedor/Nombre" /> 

無論哪種方式,你需要一次以上,這樣你就可以創建並使用一個變量,喜歡這裏:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 

    <xsl:template match="/Document"> 
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2015-08-22T13:10:05"> 
     <xsl:apply-templates select="Pedidos/Pedido/Detalle/Linea"> 
      <xsl:sort select="Cabecera/Cliente/Nombre" order="descending" /> 
     </xsl:apply-templates> 
    </dataroot> 
    </xsl:template> 

    <xsl:template match="Linea"> 
    <xsl:variable name="DatosGen" select="ancestor::Document[1]/DatosGen" /> 
    <xsl:variable name="Cabecera" select="ancestor::Pedido[1]/Cabecera" /> 
    <importarxml> 
     <Vendedor><xsl:value-of select="$DatosGen/Vendedor/Nombre" /></Vendedor> 
     <idVendedor><xsl:value-of select="$DatosGen/Vendedor/Codigo" /></idVendedor> 
     <FechaFichero><xsl:value-of select="$DatosGen/Fecha" /></FechaFichero> 
     <Pedido><xsl:value-of select="$Cabecera/Numero" /></Pedido> 
     <Fecha><xsl:value-of select="$Cabecera/Fecha" /></Fecha> 
     <Cliente><xsl:value-of select="$Cabecera/Cliente/Nombre" /></Cliente> 
     <idCliente><xsl:value-of select="$Cabecera/Cliente/Codigo" /></idCliente> 
     <Portes><xsl:value-of select="$Cabecera/Portes" /></Portes> 
     <Articulo><xsl:value-of select="Articulo" /></Articulo> 
     <Cantidad><xsl:value-of select="Cantidad" /></Cantidad> 
     <Precio><xsl:value-of select="Precio" /></Precio> 
    </importarxml> 
    </xsl:template> 
</xsl:stylesheet> 
+0

您讓我驚訝於您的輕鬆,我正在尋找關鍵功能和軸,但它不清楚在哪裏開始並且反覆強化他,並且多次發現沒有發現類似的例子。我研究變量和座標軸,謝謝。 – emiliove

相關問題