XSLT:将模板应用于某些标签,复制其余部分

问题描述 投票:0回答:1

我有一些如下所示的 XML:

<doc>
  <elem>
    Some text, <i class="i">including HTML markup</i>
    <item value="1">
      Some more text, <i>including HTML markup</i>
    </item>
    <item value="2">
      Yet more text, <i>including HTML markup</i>
    </item>
  </elem>
</doc>

我想将其转换为 HTML,其中包含

<elem>
标签内容的有序列表,后跟
<item>
元素内容的项目符号列表,如下所示:

<ol>
  <li>
    Some text, <i class="i">including HTML markup</i>

    <ul>
      <li>Some more text, <i>including HTML markup</i></li>
      <li>Yet more text, <i>including HTML markup</i></li>
    </ul>
  </li>
</ol>

我的 XSLT 样式表如下所示:

<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
                xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" encoding="UTF-8" indent="yes"/>

<xsl:template match='doc'>
  <ol>
    <xsl:apply-templates select='elem'/>
  </ol>
</xsl:template>

<xsl:template match='elem'>
  <li>
    <xsl:apply-templates select='*[not(elem|item)]|text()'/>
    <ul>
      <xsl:apply-templates select='item'/>
    </ul>
  </li>
</xsl:template>

<xsl:template match='item'>
  <li>
      <xsl:apply-templates/>
    </ul>
  </li>
</xsl:template>

<xsl:template match="*[not(elem|item)]|text()">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这是结果:

<ol>
  <li>
    Some text, <i>including HTML markup</i>
    <li>
      Some more text, <i>including HTML markup</i>
    </li>
    <li>
      Yet more text, <i>including HTML markup</i>
    </li>

    <ul>
      <li>
        Some more text, <i>including HTML markup</i>
      </li>
      <li>
        Yet more text, <i>including HTML markup</i>
      </li>
    </ul>
  </li>
</ol>

尽管

not(elem|item)
的规则中有选择器
elem
,但它在生成
item
标签之前应用了
<ul>
的模板,并且丢失了
class
标签上的
<i>
属性。

我在这里做错了什么?

html xml xslt
1个回答
0
投票

表情

<xsl:apply-templates select='*[not(elem|item)]|text()'/>

没有做你认为的那样。

我怀疑您想要做的是处理除

elem
item
子元素之外的所有子元素和文本节点(尽管在您的示例中除了
item
之外没有任何子元素)。如果这是您的意图,您可以这样做
*[not(self::elem or self::item)]
。您的表达式实际上所做的是选择没有名为
elem
item
的子元素的所有子元素。

© www.soinside.com 2019 - 2024. All rights reserved.