XSL:如何获得两个不同匹配的结果

时间:2016-05-04 13:24:24

标签: xml xslt

我愿意创建一个修改根节点属性的XSL文档,但它也能够更改XML文档的内容。

这是我的XSL文档:

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

<ns:WhiteList>
    <name>HEADER</name>
    <name>ROOTNODE</name>
    <name>foo</name>
    <name>bar</name>
    <name>toto</name>
</ns:WhiteList>

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

<xsl:template match="ROOTNODE[@xsi:id = 'myXSDFile.xsd'] ">
    <xsl:copy>
        <xsl:attribute name="xsi:id ">myXSDFCleansedFile.xsd</xsl:attribute>
        <xsl:apply-templates select="ROOTNODE[@xsi:id = 'myXSDFile.xsd']"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/ns:WhiteList/*])]"/>

</xsl:stylesheet>

我的输入XML文档如下:

<?xml version="1.0" encoding="UTF-8"?>
<ROOTNODE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:id="myXSDFile.xsd">
    <HEADER>
        ....
    </HEADER>
    <foo>blabla</foo>
    <bar>blabla</bar>
    <tab>dada</tab>
    <toto>blabla</toto>
    <titi>blabla</titi>
</ELIX>

我获得的输出是:

<?xml version="1.0" encoding="UTF-8"?>
<ROOTNODE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:id="myXSDFileCleansed.xsd">

或者:

<?xml version="1.0" encoding="UTF-8"?>
<ROOTNODE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:id="myXSDFile.xsd">
    <HEADER>
        ....
    </HEADER>
    <foo>blabla</foo>
    <bar>blabla</bar>
    <toto>blabla</toto>
</ROOTNODE>

但问题是我想要第二个输出,但xsd文件名改变了!而且我没有成功合并两个不同的匹配路径。你知道如何合并两个匹配路径吗?

1 个答案:

答案 0 :(得分:1)

我没有得到你的确切尝试。但首先,如果您在应用xsl时处理了未经处理的孩子,请尝试替换:

<xsl:apply-templates select="ROOTNODE[@xsi:id = 'myXSDFile.xsd']"/>

<xsl:apply-templates/>

当您在模板中时,上下文为ROOTNODE,当您尝试将模板应用于"ROOTNODE[...]"时,处理器正在查找名为ROOTNODE的上下文的子项。