2017-03-07 8 views
0

複数のxmlファイルが処理され、1つのxmlファイルに書き込まれます。私は変換の大部分を行い、1つのxmlファイルに特定の要素を見つけるという場所を打ちました。xsltを使用してxmlファイル内の特定の要素を見つける

(parts.xml)であるソースXMLのひとつ:

<parts> 
    <part> 
     <name>head shaft</name> 
     <code>100</code> 
    </part> 
    ... 
</parts> 

別のソースXML(price.xml):

<price-list> 
    <price> 
     <part-name>head shaft</part-name> 
     <cost>28.45</cost> 
     ... 
    </price> 
    ... 
</price-list> 

そして、私はに属しているだけのコード要素を取得する必要があります特定の名前要素 これは1つのソースXMLファイルです。このように、私は多くの処理が必要です。

マイ出力XMLは、この(result.xml)のようにする必要があり:部品コードを取得するために

<part-order> 
    <part code=100 name="head shaft" price=32.05 qty=1 /> 
    ... 
</part-order> 

マイXSLT関数は次のとおりです。

<xsl:function name="p:find"> 
    <xsl:variable name="partdoc" select="document('parts.xml')"/> 
    <xsl:param name="str"/> 
    <xsl:apply-templates select="$partdoc/p:/parts/part[contains(p:name, '$str')]"/> 
    <xsl:apply-templates select="$partdoc/p:code" /> 
</xsl:function> 

そして最後に、私は、関数を呼び出したいです

<xsl:template match="/"> 
    <xsl:copy> 
     <xsl:variable name="code"> 
      <xsl:value-of select="p:find('head shaft')"/> 
     </xsl:variable> 
     <part code="{'$code'}" name="{'head shaft'}" price="{$somelogic}"/>      
    </xsl:copy> 
</xsl:template> 

私は関数宣言で間違いをしています。あなたは助けてください。

答えて

0

<xsl:key name="part-ref" match="parts/part" use="name"/>キーを定義し、グローバルパラメータまたは変数<xsl:variable name="partdoc" select="document('parts.xml')"/>を使用すると、<part code="{key('part-ref', 'head shaft', $partdoc)/code}" .../>を使用できます。

キーがそのように提供するので、相互参照のための関数を書く必要はありません。ここ

が完了例であり、一次入力文書は

<?xml version="1.0" encoding="UTF-8"?> 
<price-list> 
    <price> 
     <part-name>head shaft</part-name> 
     <cost>28.45</cost> 
     ... 
    </price> 
    ... 
</price-list> 

他の文書は

XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:key name="part-ref" match="parts/part" use="name"/> 

    <xsl:variable name="partdoc" select="document('parts.xml')"/> 

    <xsl:template match="price-list"> 
     <part-order> 
      <xsl:apply-templates/> 
     </part-order> 
    </xsl:template> 

    <xsl:template match="price"> 
     <part code="{key('part-ref', part-name, $partdoc)/code}" name="{part-name}" price="{cost}" qty="1" /> 
    </xsl:template> 

</xsl:stylesheet> 

出力

<part-order> 
    <part code="100" name="head shaft" price="28.45" qty="1"/> 
    ... 
</part-order> 
ある所与
<?xml version="1.0" encoding="UTF-8"?> 
<parts> 
    <part> 
     <name>head shaft</name> 
     <code>100</code> 
    </part> 
    ... 
</parts> 

あります

+0

キーでドキュメント参照を呼び出すことは可能ですか?私はそれを呼び出そうとしましたが、結果を表示しませんでした。キー( 'part-ref'、 'head shaft'、$ partdoc)/ code –

+0

@SrikrishnaPothukuchi、私は私のためにうまくいく完全な例で答えを編集しました。それでも問題が解決しない場合は、最小限の完全なXMLサンプル、現在のXSLT、入手した出力、使用されているXSLTプロセッサに関する情報を示す質問を編集してください。 –

+0

百万のマーティンに感謝します。あなたが正しく指摘したように、それは私のEclipseで問題です。私はEclipse NeonでSaxon 9.7を使用しています。ときには正しく動作しないことがあります。 XML Spearを使用した場合、同じコードが100%の精度で動作しています。 –

関連する問題