我愿意创建一个修改根节点属性的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文件名改变了!而且我没有成功合并两个不同的匹配路径。你知道如何合并两个匹配路径吗?
答案 0 :(得分:1)
我没有得到你的确切尝试。但首先,如果您在应用xsl时处理了未经处理的孩子,请尝试替换:
<xsl:apply-templates select="ROOTNODE[@xsi:id = 'myXSDFile.xsd']"/>
与
<xsl:apply-templates/>
当您在模板中时,上下文为ROOTNODE
,当您尝试将模板应用于"ROOTNODE[...]"
时,处理器正在查找名为ROOTNODE
的上下文的子项。