0

私は次のxmlを持っています:

<PCstore>
    <StoreList>
        <Store id="001">
            <ItemList>
                <Items laptop="DELL" price="300"/>
                <Items laptop="gateway" price="450"/>
                <Items screen="LG" price="200"/>
            </ItemList>
        </Store>
    </StoreList>
</PCstore>

私はとマージする必要があります:

<PCstore>
    <StoreList>
        <Store id="002">
            <ItemList>
                <Items laptop="gateway" price="650"/>
                <Items screen="LG" price="200/>
                <Items speakers="sony" price="50"/>
            </ItemList>
        </Store>
    </StoreList>
</PCstore>

そして、属性 (laptop="gateway") を ifiltering する欲求の出力:

<PCstore>
    <StoreList>
        <Store id="001">
            <ItemList>
                <Items laptop="gateway" price="450"/>
            </ItemList>
        </Store>
        <Store id="002">
            <ItemList>
                <Items laptop="gateway" price="650"/>
            </ItemList>
        </Store>
    </StoreList>
</PCstore>

さらにxml3.xml、xml4.xmlなど...

私が試したコードがありません。私は XSLT の初心者です。誰かが私を助けてくれることを願っています。

更新

このコードを試しましたが、うまくいきません...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Items">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
      <xsl:apply-templates
        select="document('xml2.xml')
              /PCstore/StoreList/Store/ItemList[@id = current()/../@id]
                     /Items[@laptop = current()/@value]/*" />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
4

2 に答える 2

1

XSLT1.0 しか使用できない場合、これを行う 1 つの方法は、xml ファイルのリストをパラメーターとして XSLT に渡すことです。例えば:

<xsl:param name="filelist">
   <files>
      <file>xml2.xml</file>
      <!-- We can place here xml3.xml and so on -->
   </files>
</xsl:param>

(したがって、この場合、XSLT を最初の xml1.xml に適用し、他のファイルのみをパラメーターとして渡すと想定しています)。

ただし、XSLT1.0 では、拡張関数を使用して、このパラメーターをノード セットとして処理する必要があります。これを行うと、「変数またはパラメータ 'ファイル' への参照はノード リストに評価する必要があります。<xsl:for-each select="$filelist/files/file"> 」というエラーが発生します。したがって、拡張関数を使用してnode-setに変換する必要があります。私の例では、Microsoft のものを使用しますが、プラットフォームによっては、exslt.org/common を使用する場合があります。

この場合の完全な XSLT は次のとおりです。

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:msxml="urn:schemas-microsoft-com:xslt" 
     extension-element-prefixes="msxml">

   <xsl:output omit-xml-declaration="yes" indent="yes"/>
   <xsl:strip-space elements="*"/>

   <xsl:param name="filelist">
      <files>
         <file>xml2.xml</file>
      </files>
   </xsl:param>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="StoreList">
      <xsl:copy>
         <xsl:apply-templates select="@* | node()"/>
         <xsl:for-each select="msxml:node-set($filelist)/files/file">
            <xsl:apply-templates select="document(text())/PCstore/StoreList/Store"/>
         </xsl:for-each>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="Items[not(@laptop='gateway')]"/>
</xsl:stylesheet>

XSLT に適用すると、次のように出力されます

<PCstore>
   <StoreList>
      <Store id="001">
         <ItemList>
            <Items laptop="gateway" price="450"/>
         </ItemList>
      </Store>
      <Store id="002">
         <ItemList>
            <Items laptop="gateway" price="650"/>
         </ItemList>
      </Store>
   </StoreList>
</PCstore>

これが機能するには、ファイルが存在する必要があることに注意してください。存在しないファイル名を渡すとエラーになります。

于 2013-03-17T09:10:03.453 に答える
0

XSLT 2.0 を使用できる場合は、次を使用できますcollection()...

xml1.xml

<PCstore>
    <StoreList>
        <Store id="001">
            <ItemList>
                <Items laptop="DELL" price="300"/>
                <Items laptop="gateway" price="450"/>
                <Items screen="LG" price="200"/>
            </ItemList>
        </Store>
    </StoreList>
</PCstore>

xml2.xml

<PCstore>
    <StoreList>
        <Store id="002">
            <ItemList>
                <Items laptop="gateway" price="650"/>
                <Items screen="LG" price="200"/>
                <Items speakers="sony" price="50"/>
            </ItemList>
        </Store>
    </StoreList>
</PCstore>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="type" select="'laptop'"/>
    <xsl:param name="brand" select="'gateway'"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/">
        <PCstore>
            <StoreList>
                <xsl:apply-templates select="collection('file:///C:/store_test?select=*.xml')/PCstore/StoreList/Store"/>
            </StoreList>
        </PCstore>
    </xsl:template>

    <xsl:template match="Items[not(@*[name()=$type]=$brand)]"/>

</xsl:stylesheet>

出力

<PCstore>
   <StoreList>
      <Store id="001">
            <ItemList>

                <Items laptop="gateway" price="450"/>

            </ItemList>
        </Store>
      <Store id="002">
            <ItemList>
                <Items laptop="gateway" price="650"/>


            </ItemList>
        </Store>
   </StoreList>
</PCstore>
于 2013-03-17T02:19:09.963 に答える