2012-01-22 14 views
4

判定xmlファイル(Input2)で使用可能なデータに基づいて、マスターXMLファイル(Input1)から出力XMLファイルを生成しようとしています。2つのXMLファイルを入力として出力XMLファイルを生成するXSLT

マスターファイル

<Level1> 

<Level2> 
    <LinkedTo>DATA1</LinkedTo> <!DATA1 in the decision file> 
    <Attribute1>1</Attribute1> 
    <Attribute2>2</Attribute2> 
</Level2> 

<Level2> 
    <LinkedTo>DATA2</LinkedTo> 
    <Attribute1>3</Attribute1> 
    <Attribute2>4</Attribute2> 
</Level2> 

</Level1> 

決定ファイル:

<TopLevel> 
<DATA1> 
    <Available>Y</Available> 
</DATA1> 

<DATA2> 
    <Available>N</Available> 
</DATA2> 

</TopLevel> 

XSLT(デシジョンファイルにYESまたはNOに基づいて)必須出力結果のファイルを処理したとき。

<Level1> 
<Level2> 
    <Attribute1>1</Attribute1> 
    <Attribute2>2</Attribute2> 
</Level2> 
</Level1> 

私は以前にXMLのことをやったことがないと告白する必要がありますが、これはフィージビリティスタディに必要です。 XSLTには何が必要ですか?私はあなたの答えを使用し、概念を拡張することができます。

代替(Python、C#、C、C++など)がある場合は、それらも歓迎します。私はC/C++や手続き型言語で管理することができます。

答えて

6

document機能を使用してください。例えば、意思決定のXMLへのURIを渡します。別の方法として

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Level1"> 
    <xsl:copy> 
     <xsl:apply-templates select="Level2"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Level2"> 
    <xsl:if test="document('Decision.xml')/TopLevel/*[ 
     name() = current()/LinkedTo and Available = 'Y']"> 
     <xsl:copy> 
     <xsl:apply-templates select="*[not(self::LinkedTo)]"/> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="*"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 
+1

私の謝罪は、私はしばらくの間、stackoverflowをオフにしています。両方のソリューション(KirillとMartin)はちょっとした調整だけで私にとっても同じように機能しました。私はまた、私の問題声明のためのUMLモデリングのような他の方法を調べています。 – Raj

2

を、ここではサクソン9、AltovaXML、XQSharpのようなXSLT 2.0プロセッサを使用することができますXSLT 2.0のソリューションです:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

<xsl:param name="dec-file" select="'decision.xml'"/> 
<xsl:variable name="dec-doc" select="document($dec-file)"/> 

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

<xsl:key name="k1" match="TopLevel/*" use="name()"/> 

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

<xsl:template match="Level2[key('k1', LinkedTo, $dec-doc)/Available != 'Y']"/> 

<xsl:template match="Level2[key('k1', LinkedTo, $dec-doc)/Available = 'Y']/LinkedTo"/> 

</xsl:stylesheet> 
関連する問題