2

私はこのようなメインのXMLドキュメントを持っています:

<chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter1">
<title>First chapter</title>
      <section xml:id="section1">
                <imageobject>
                    <id>aa12</id>
                    <image fileref="image1.jpg"/>
                </imageobject>
                <imageobject>
                    <id>bb13</id>
                    <image fileref="image2.jpg"/>
                </imageobject>
      </section>
      <section xml:id="section2" xml:base="../other/section1.xml">  
                    <imageobject>
                        <id>ab14</id>
                        <image fileref="image1.jpg"/>
                    </imageobject>
                    <imageobject>
                        <id>ab15</id>
                        <image fileref="image2.jpg"/>
                    </imageobject>

             <section xml:id="section3" xml:base="../some-other/more/section3.xml">
                    <imageobject>
                        <id>ac16</id>
                        <image fileref="image1.jpg"/>
                    </imageobject>
             </section>
    </section>
    <section xml:id="section4" xml:base="../some-other/section4.xml">
                    <imageobject>
                        <id>ac17</id>
                        <image fileref="image2.jpg"/>
                    </imageobject>
    </section>
 </chapter>

および別のXMLファイルと次のような値:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <NewData>
       <Rename id="ab14" imageName="aaaa.jpg"/>
       <Rename id="ab15" imageName="bbbb.jpg"/>
       <Rename id="ac16" imageName="cccc.jpg"/>
       <Rename id="ac17" imageName="dddd.jpg"/>
    </NewData>

そして最後に、以下のような出力が必要です。これは、id値に応じて名前が変更された正しい画像名に置き換えられます。

<chapter xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="chapter1">
    <title>First chapter</title>
    <section xml:id="section1">
                    <imageobject>
                        <image fileref="image1.jpg"/>
                    </imageobject>
                    <imageobject>
                        <image fileref="image2.jpg"/>
                    </imageobject>
    </section>
    <section xml:id="section2" xml:base="../other/section1.xml">  
                        <imageobject>
                            <image fileref="aaaa.jpg"/>
                        </imageobject>
                        <imageobject>
                            <image fileref="bbbb.jpg"/>
                        </imageobject>

             <section xml:id="section3" xml:base="../some-other/more/section3.xml">
                        <imageobject>
                            <image fileref="cccc.jpg"/>
                        </imageobject>
             </section>
   </section>
   <section xml:id="section4" xml:base="../some-other/section4.xml">
                        <imageobject>
                            <image fileref="dddd.jpg"/>
                        </imageobject>
   </section>
</chapter>

ここで何が起こるかというとid、最初のXMLドキュメントのid属性が2番目のXMLの属性と一致する場合、最初のドキュメントのの値は2番目のXMLファイルの値にfileref置き換えられます。imageName

ここで示した例をご覧ください。

XSLT 1.0を使用してこれを行うにはどうすればよいですか?

SaxonまたはXsltprocプロセッサを使用しています。

前もって感謝します..!!

4

1 に答える 1

3

XSLT 1.0スタイルシートは次のとおりです(xsltprocとSaxon 6の両方でサポートされているexsl:node-setを使用):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  exclude-result-prefixes="exsl">

<xsl:param name="doc2-url" select="'test2012080602.xml'"/>
<xsl:variable name="doc2" select="document($doc2-url)"/>

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

<xsl:key name="img-by-id" match="Rename" use="@id"/>

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

<xsl:template match="imageobject">
   <xsl:copy>
     <xsl:variable name="id" select="id"/>
     <xsl:variable name="ref">
       <xsl:for-each select="$doc2">
         <xsl:if test="key('img-by-id', $id)">
           <image filref="{key('img-by-id', $id)/@imageName}"/>
         </xsl:if>
       </xsl:for-each>
     </xsl:variable>
     <xsl:variable name="new" select="exsl:node-set($ref)/image"/>
     <xsl:choose>
       <xsl:when test="$new">
         <xsl:copy-of select="$new"/>
       </xsl:when>
       <xsl:otherwise>
         <xsl:copy-of select="image"/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:copy>
</xsl:template>

</xsl:stylesheet>

パラメータdoc2-urlを、新しい名前のセカンダリ入力ドキュメントの場所に設定できます。

于 2012-08-06T10:45:16.610 に答える