2011-08-09 12 views
3

私は2つのファイルのXSLTで、このようなのOutput.xmlを生成する方法XSLTがXML要素内の属性を置き換えるのは、別のXMLに存在する場合ですか?

のcatalog.xml

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <CD Title="Still got the blues" vinyl="unknown"/> 
    <CD Title="When a man loves a woman" vinyl="unknown"/> 
</catalog> 

vinyl.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Vinyl> 
    <Album> 
     <Title>When a man loves a woman</Title> 
     <Vinyl>Yes</Vinyl> 
    </Album> 
</Vinyl> 

がありますか?

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
    <CD Title="Still got the blues" vinyl="unknown"/> 
    <CD Title="When a man loves a woman" vinyl="yes"/>*** 
</catalog> 

***この行は、それがのOutput.xml

答えて

4

に次のように変更しbecouse変換マークは、document()を使用して、入力および負荷vinyl.xmlとしてのcatalog.xmlを使用しています。単純なテストを行うだけでマージを実行します。


属性の[XSLT 1.0]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:variable name="vinyl" select="document('test_i2.xml')"/> 

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

    <xsl:template match="@vinyl"> 
     <xsl:attribute name="vinyl"> 
      <xsl:variable name="test" select=" 
       $vinyl/Vinyl/Album[Title=current()/../@Title]/Vinyl"/> 
      <xsl:choose> 
       <xsl:when test="$test"> 
        <xsl:value-of select="$test"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="."/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

このテンプレートは以下の即時ですが、それは純粋なXPathを活用する:

<xsl:template match="@vinyl"> 
    <xsl:attribute name="vinyl"> 
     <xsl:value-of select=" 
      $vinyl/Vinyl/Album[Title=current()/../@Title]/Vinyl 
      | 
      self::node()[count($vinyl/Vinyl/Album[Title=current()/../@Title])=0]"/> 
    </xsl:attribute> 
</xsl:template> 
+2

+ 1、あなたは私を倒します: - ) –

+1

属性を直接照合して簡略化しました。 –

+1

@キリルありがとう。それは私にとって最も即座の答えです。選択のような制御命令を使用しない代替案を見たいでしょうか。 –

関連する問題