2017-08-04 105 views
0

我有2個XML文件:XSLT:將2個XML文件到一個

文件1:

<?xml version="1.0" encoding="UTF-8"?> 
<offer file_format="IOF" generated="2017-08-04 05:27:56" version="2.5" extensions="no"><products xmlns:iaiext="http://www.iai-shop.com/developers/iof/extensions.phtml"> 
    <product id="1356"> 
     <name>Name1</name> 
    </product> 
    <product id="1357"> 
     <name>Name2</name> 
    </product> 
</products> 
</offer> 

和file2:

<?xml version="1.0" encoding="UTF-8"?> 
<offer file_format="IOF" generated="2017-08-04 05:27:56" version="2.5" extensions="no"> 
    <products xmlns:iaiext="http://www.iai-shop.com/developers/iof/extensions.phtml"> 
     <product id="1356"> 
      <avail>True</avail> 
     </product> 
     <product id="1357"> 
      <avail>False</avail> 
     </product> 
    </products> 
</offer> 

我想要得到這樣的:

<product id="1356"> 
    <name>Name1</name> 
    <avail>True</avail> 
</product> 
<product id="1357"> 
    <name>Name2</name> 
    <avail>False</avail> 
</product> 

我該怎麼做?當我在'名字'循環中時,它讀錯了'有效'。

我的XSLT文件:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSLT/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="offer/products/product"> 
      <xsl:value-of select="name" /> 
      <xsl:value-of select="document('File2.xml')/offer/products/product/avail"/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

我試圖用一個變量,結果是一樣的。

+0

你可以編輯你的問題來顯示XS你目前試過的LT?謝謝! –

+0

好的,我添加了我的xslt代碼。 – pasza

+0

你是否也想刪除命名空間? – zx485

回答

0

您應該使用xsl:copy而不是這裏的xsl:value-of,因爲您希望複製整個節點,而不僅僅是文本值。

此外,當您從「file2.xml」選擇你所需要的條件指定當前產品ID。

另外請注意,你已經顯示了在xsl前綴的名稱空間URI是錯誤的。它應該是 「http://www.w3.org/1999/XSL/Transform

嘗試此XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="offer/products/product"> 
      <xsl:copy> 
       <xsl:copy-of select="@*|name" /> 
       <xsl:copy-of select="document('File2.xml')/offer/products/product[@id = current()/@id]/avail"/> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
0

這是一個XSLT-1.0溶液也除去名稱空間:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:iaiext="http://www.iai-shop.com/developers/iof/extensions.phtml"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:variable name="second" select="document('File2.xml')/offer/products" /> 

    <!-- copy elements without namespace --> 
    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 

    <!-- remove offer element --> 
    <xsl:template match="offer"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <!-- reconstruct 'product' element --> 
    <xsl:template match="product"> 
     <xsl:variable name="id" select="@id" /> 
     <xsl:element name="product">  <!-- clear the namespace --> 
     <name><xsl:value-of select="name" /></name> 
     <avail><xsl:value-of select="$second/product[@id=$id]/avail"/></avail> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

輸出是(具有根元素 '產品' ):

<?xml version="1.0" encoding="UTF-8"?>  
<products> 
    <product> 
     <name>Name1</name> 
     <avail>True</avail> 
    </product> 
    <product> 
     <name>Name2</name> 
     <avail>False</avail> 
    </product> 
</products> 
相關問題