基本的には、2つの異なるxslt変換の出力を結合する必要があります。2つのリストをxsltとマージする
私は2つの内のXSLTインポートと組み合わせるために「container.xslt」を使用しています:2つの変換ファイルがそのようにXSLTツーリングプログラムによって生成された「transform2.xslt」
を「transform1.xsltを」と私はそれらに変更を加えることを避けたいと思います。
これは私の入力xmlです:
<Enrollments>
<Enrollment>
<MEDICAL id="11111111">
</MEDICAL>
</Enrollment>
</Enrollments>
これは私が現在取得しています出力されます。ここでは
<fields>
<fields>
<field name="ID1">
<value>11111111</value>
</field>
</fields>
<fields>
<field name="ID2">
<value>11111111</value>
</field>
</fields>
</fields>
は私が探して出力されます:
<fields>
<field name="ID1">
<value>11111111</value>
</field>
<field name="ID2">
<value>11111111</value>
</field>
</fields>
コンテナxslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs fn">
<xsl:include href="./transform1.xslt"/>
<xsl:include href="./transform2.xslt"/>
<xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>
<xsl:variable name="list1">
<xsl:call-template name="one" />
</xsl:variable>
<xsl:param name="list2">
<xsl:call-template name="two"/>
</xsl:param>
<xsl:template name="mergedList" match="/">
<fields>
<xsl:copy-of select="$list1" />
<xsl:copy-of select="$list2" />
</fields>
</xsl:template>
</xsl:stylesheet>
transform1.xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn">
<xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>
<xsl:template match="/" name="one">
<fields>
<field>
<xsl:attribute name="name" select="'ID1'"/>
<xsl:for-each select="Enrollments/Enrollment/MEDICAL">
<value>
<xsl:sequence select="fn:string(@id)"/>
</value>
</xsl:for-each>
</field>
</fields>
</xsl:template>
</xsl:stylesheet>
transform2.xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn">
<xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>
<xsl:template match="/" name="two">
<fields>
<field>
<xsl:attribute name="name" select="'ID2'"/>
<xsl:for-each select="Enrollments/Enrollment/MEDICAL">
<value>
<xsl:sequence select="fn:string(@id)"/>
</value>
</xsl:for-each>
</field>
</fields>
</xsl:template>
</xsl:stylesheet>
それは全く別の質問に属しているかもしれませんが、誰もが提案を持っている場合は、私がそれをここに追加します。私はcontainer.xsltに名前付きテンプレートを使用できるように、これらの2行を変換ファイルに追加する必要がありました。任意の提案を事前に
<xsl:attribute name="name" select="'ID1'"/>
と
<xsl:attribute name="name" select="'ID2'"/>
XLST輸入感謝を変えることを避けるために理想的です!私はかなり新しくxsltを手にしていません。
私はそれが過度に設計されているようだと同意します。私は2つのインポートされたxsltsをかなり単純化して、可能な限り一般的な例にしています。 2つのxslts変換を実行して出力を結合する方法が本当に必要です。提案していただきありがとうございますが、それは私の質問の根本的な問題になっていません。(たぶん私がそれに尋ねたから:-)) – WannaBeDev
ああ。修正された解答を参照 – Tomalak
素晴らしい、多くのありがとう!私はそれが何か単純だと思った。私は$ list1/fieldsではなく$ list1/fields/fieldを試していました – WannaBeDev