当前位置: 首页 > 知识库问答 >
问题:

XSLT:如何编写一个“”,在不影响顺序的情况下,将节点与具有模式和没有模式的模板进行匹配?

慕阳文
2023-03-14

假设我有以下XML:

<root>
    <a>1</a>
    <b>2</b>
    <a>3</a>
    <c>4</c>
    <a>5</a>
    <a>6</a>
    <b>7</b>
    <a>8</a>
    <c>9</c>
</root>

考虑以下XSL:

<xsl:template match="root">
    <xsl:apply-templates select="a | b | c"/>    <!-- matches node 'b' with a non-mode template instead of the one with mode="test" -->
</xsl:template>

<xsl:template match="a">
    <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="b">
    <xsl:text> ignore </xsl:text>
</xsl:template>

<xsl:template match="b" mode="test">
    <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="c">
    <xsl:value-of select="."/>
</xsl:template>

我试图编写一个XSL模板调用,该调用将根节点内的所有节点与其对应的模板匹配,但节点应与具有模式=“test”的模板匹配。不应干扰节点处理的顺序。

期望的输出是:

1
2
3
4
5
6
7
8
9

共有2个答案

盖锐
2023-03-14

我将定义一个新模式,然后根据需要重定向它:

<xsl:template match="root">
    <xsl:apply-templates select="a | b | c" mode="new"/>  
</xsl:template>

<xsl:template match="a|c" mode="new">
    <xsl:apply-templates select="."/>
</xsl:template>

<xsl:template match="b" mode="new">
    <xsl:apply-templates select="." mode="test"/>
</xsl:template>

另一种解决方案是定义适用于多种模式的模板规则,因此a和c的“未命名模式”模板也适用于模式“new”,而b的mode=“test”模板也适用于模式“new”。IIRC这需要XSLT 2.0(您不要说您使用的是哪个版本-请在以后这样做)。

西门逸仙
2023-03-14

我不知道这是否适用于你。而不是

<xsl:template match="root">
    <xsl:apply-templates select="a | b | c"/>
</xsl:template>

<xsl:template match="root">
    <xsl:for-each select="*">
        <xsl:choose>
            <xsl:when test="name()='a'">
                <xsl:apply-templates select="."/>
            </xsl:when>
            <xsl:when test="name()='b'">
                <xsl:apply-templates select="." mode="test"/>
            </xsl:when>
            <xsl:when test="name()='c'">
                <xsl:apply-templates select="."/>
            </xsl:when>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>
 类似资料:
  • 我知道这可以在Servlet3.0中通过@Webservlet注释实现,在这里您只需分配url模式,而不必在web.xml中进行任何配置。是否有一种方法可以通过编程方式为运行Servlet2.5的应用程序分配servlets url模式? 我正在创建一个库,多个应用程序将依赖于它,并试图使它,以便这些应用程序中的每一个都不必显式配置任何servlet url映射,我正在创建的库中的servlet在

  • 我在想怎样才能 1) 如何在没有GUI的情况下直接在Eclipse中运行模型——只需像在Eclipse中运行其他java代码一样运行模型,然后打印出我感兴趣的内容。 2)如何在没有Eclipse的情况下在无头模式下运行它-我计划将我的模型部署在远程服务器中,服务器或我自己的PC可以在一天中的特定时间自动运行模型。 3) 每次更改代码时,我都必须启动一个新的GUI以反映代码的更改。打开GUI至少需要

  • 我只需要在所有嵌套目录(包括 PWD)下匹配具有一个特定扩展名的文件,并使用“通配”的 BASH。 我不需要将所有嵌套目录下的所有文件与 shell 通配匹配,但不需要在 PWD 中匹配。 我需要使用 grep 以外的命令匹配文件,搜索所有文件扩展名的目录 我不需要只递归地 grep,而只需要在具有某些扩展名(复数)的文件中 适用于所有文件(不是我的问题)。 在 PWD 中不匹配。 返回重复文件。

  • 我不明白为什么first方法在并行模式下是有缺陷的,而且书中没有解释。 拜托,解释一下。

  • 问题内容: 我想在我的(Python)代码中使用Django模板引擎,但是我没有构建基于Django的网站。如何在没有settings.py文件(和其他文件)且无需设置DJANGO_SETTINGS_MODULE环境变量的情况下使用它? 如果我运行以下代码: 我得到: 问题答案: 解决方案很简单。它实际上有据可查,但不太容易找到。(我不得不仔细研究- 当我尝试了几种其他的Google搜索时,它并没

  • 问题内容: 我想在我的(Python)代码中使用Django模板引擎,但是我没有构建基于Django的网站。如何在没有settings.py文件(和其他文件)且无需设置DJANGO_SETTINGS_MODULE环境变量的情况下使用它? 如果我运行以下代码: 我得到: 问题答案: 解决方案很简单。它实际上有据可查,但不太容易找到。(我必须仔细研究-当我尝试了几种其他的Google搜索时并没有出现。