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

Posted

技术标签:

【中文标题】XSL:如何获得两个不同匹配的结果【英文标题】:XSL : how to obtain the result of two different match 【发布时间】:2016-08-29 23:25:44 【问题描述】:

我愿意创建一个修改根节点属性的 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】:

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

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

<xsl:apply-templates/>

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

【讨论】:

以上是关于XSL:如何获得两个不同匹配的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板匹配代码中获得结果?

我如何在 Elastic Search 中获得完全匹配过滤器结果

给定通过不同的 `SemanticModel` 实例获得的匹配 IMethodSymbol 对象,如何获取 IMethodSymbol 对象?

如何获得以下场景的完全匹配连接?

一个字段中的两个条件以获得一个结果

如何根据核心数据中的一个字段获得不同的结果