2012-01-22 51 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或在决策文件否)。

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

我必须承认我从来没有做过XML的东西,但这是可行性研究所需要的。 XSLT应该是什么?我可以使用你的答案并扩展这个概念。或者如果有其他选择(python,C#,C,C++等),那么也欢迎这些。我可以用C/C++或任何面向过程的语言进行管理。

回答

6

使用document功能。通过URI来决定XML,例如:

<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

我的道歉,我已经离开了一段时间了。这两个解决方案(基里尔和马丁)都为我做了一点小小的调整。我也在研究其他方法,比如我的问题陈述的UML建模。 – Raj

2

作为替换,在这里是可与XSLT使用2.0处理器等撒克逊9,AltovaXML,XQSharp一个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>