2017-02-09 7 views
0

'affiliation'要素をXSLTの 'for-each'コンテキストにある 'contrib'要素に移動するにはどうすればよいですか?要素をXSLTの別の変換要素に移動するにはどうすればよいですか?

入力XML:

<article> 
    <authors>Amrendra, Kumar; Mohan, Kumar</authors> 
    <affiliation id="Amrendra, Kumar">Amrendra, Kumar</affiliation> 
    <affiliation id="Mohan, Kumar">Mohan, Kumar</affiliation> 
</article> 

電流出力:

<contrib-group> 
    <contrib> 
    <string-name>Amrendra, Kumar</string-name> 
    </contrib> 
    <contrib> 
    <string-name>Mohan, Kumar</string-name> 
    </contrib> 
    <aff id="Amrendra, Kumar">Amrendra, Kumar</aff> 
    <aff id="Mohan, Kumar">Mohan, Kumar</aff> 
</contrib-group> 

XSLTコード:

<xsl:template match="authors"> 
    <xsl:choose> 
     <xsl:when test="not(node())"/> 
     <xsl:otherwise> 
      <contrib-group> 
       <xsl:for-each select="tokenize(., ';')"> 
       <contrib> 
        <string-name> 
         <xsl:value-of select="normalize-space(.)"/> 
        </string-name> 
       </contrib> 
       </xsl:for-each> 
       <xsl:apply-templates select="../affiliation"/> 
      </contrib-group> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

必要な出力:(AFF/@ IDとのcontrib /#のPCDATAとのマッチング)

私はcontribの内側に「所属」要素を適用しようが、それはエラーの下に表示されます。

[Saxon-PE 9.5.1.7] XPTY0020: Cannot select the parent of the context node: the context item is not a node 
+0

を回避するために変化する必要がありますあなたはあなたの問題をしてください示して完全なXSLTを表示することができますか?あなたの実際のXSLTが 'xsl:for-each'構造内で' 'を持たない限り、それ以降ではありません。ありがとうございました。 –

+0

著者と対応する「所属」との正確なリンクは?あなたは3つの場所で同じ値を持っていますが、どのペアを使用するかは分かりません。 –

答えて

0

authors文字列はaffiliation/@idの値と一致するトークンが含まれていると仮定すると、あなたが行うことができます:

XSLT 2.0

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

<xsl:key name="aff" match="affiliation" use="@id" /> 

<xsl:template match="article"> 
    <xsl:variable name="current-article" select="." /> 
    <contrib-group> 
     <xsl:for-each select="tokenize(authors, '; ')"> 
      <contrib> 
       <string-name> 
        <xsl:value-of select="."/> 
       </string-name> 
       <xsl:apply-templates select="key('aff', ., $current-article)[node()]"/> 
      </contrib> 
     </xsl:for-each> 
    </contrib-group> 
</xsl:template> 

<xsl:template match="affiliation"> 
    <aff> 
     <xsl:copy-of select="@* | node()" /> 
    </aff> 
</xsl:template> 

</xsl:stylesheet> 

番目を取得します必要な出力。

+0

ありがとうございます。今私は結果を得たが、常に@idで空のaffと来る。私はここでさらに2つの懸念があります: 1)「所属」内にいくつかのデータがある場合。現在のロジックは空になります。 2) 'affiliation'が空の場合、 'aff'を生成する必要はありませんか? –

+0

@AmrendraKumar私はいくつかの変更を加えました。それがあなたの懸念を満たすかどうかを見てください。 –

0
<aff id="{.}"> 
    <xsl:value-of select="key('aff', ., $current-article)" /> 
</aff> 

は、スペースや欠損値

<aff id="{normalize-space(.)}"> 
    <xsl:value-of select="key('aff', normalize-space(.), $current-article)" /> 
</aff> 
+0

ありがとうございました!私はあなたのコメントの両方を結合し、私はそれを得た。しかし、「所属」が空(PCDATAなし)で「所属」を削除した場合は、もう一度変更する必要があります。再度、感謝します –

関連する問題