无法使用XSLT匹配模式

无法使用XSLT匹配模式,xslt,xslt-2.0,Xslt,Xslt 2.0,我在下面介绍了XML <?xml version="1.0" encoding="UTF-8"?> <list> <list.item> <label>(1)</label> This is first list item) </list.item> <list.item><label> <star.page>179</star.page> (2)&

我在下面介绍了XML

<?xml version="1.0" encoding="UTF-8"?>
<list>
  <list.item>
    <label>(1)</label> This is first list item)
  </list.item>
  <list.item><label>
    <star.page>179</star.page> (2)</label>This is second)
  </list.item>
  <list.item><label>(3)</label>This is third)</list.item>
</list>
我当前的输出是

<hmtl>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>New Version!</title>
   </head>
   <ol class="eng-orderedlist orderedlist">

      <li class="item">
        <div class="para">
          <span class="item-num">(1)</span>This is first list item)
        </div>
      </li>

      <div class="x">179</div>

      <li class="item">
        <div class="para">
          <span class="item-num">(2)</span>This is second)
        </div>
      </li>     
      <li class="item">
        <div class="para">
          <span class="item-num">(3)</span>This is third)
        </div>
      </li>     
   </ol>
</hmtl>
<hmtl>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>New Version!</title>
   </head>
   <ol class="eng-orderedlist orderedlist">
     <li class="item">
       <div class="para">
         <span class="item-num">(1)</span>This is first list item)
       </div>
     </li>
   </ol>

   <div class="x">179</div>

   <ol class="eng-orderedlist orderedlist">
     <li class="item">
       <div class="para">
         <span class="item-num">(2)</span>This is second)
       </div>
     </li>

     <li class="item">
       <div class="para">
         <span class="item-num">(3)</span>This is third)
       </div>
     </li>
   </ol>
</hmtl>

新版本!
  • (1) 这是第一个列表项)
  • 179
  • (2) 这是第二次)
  • (3) 这是第三次)
  • 但我的预期产出是

    <hmtl>
       <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>New Version!</title>
       </head>
       <ol class="eng-orderedlist orderedlist">
    
          <li class="item">
            <div class="para">
              <span class="item-num">(1)</span>This is first list item)
            </div>
          </li>
    
          <div class="x">179</div>
    
          <li class="item">
            <div class="para">
              <span class="item-num">(2)</span>This is second)
            </div>
          </li>     
          <li class="item">
            <div class="para">
              <span class="item-num">(3)</span>This is third)
            </div>
          </li>     
       </ol>
    </hmtl>
    
    <hmtl>
       <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
          <title>New Version!</title>
       </head>
       <ol class="eng-orderedlist orderedlist">
         <li class="item">
           <div class="para">
             <span class="item-num">(1)</span>This is first list item)
           </div>
         </li>
       </ol>
    
       <div class="x">179</div>
    
       <ol class="eng-orderedlist orderedlist">
         <li class="item">
           <div class="para">
             <span class="item-num">(2)</span>This is second)
           </div>
         </li>
    
         <li class="item">
           <div class="para">
             <span class="item-num">(3)</span>This is third)
           </div>
         </li>
       </ol>
    </hmtl>
    
    
    新版本!
    
  • (1) 这是第一个列表项)
  • 179
  • (2) 这是第二次)
  • (3) 这是第三次)
  • 在上面的预期输出
    div class=“x”
    ,您可以看到
    已关闭,打印
    div class=“x”
    后,它将重新打开(
    ),请告诉我哪里出了问题以及如何修复它

    这是工作演示

    如果
    将在标签下,那么您甚至不需要xsl:choose。虽然xslt可以以更干净、更高效的方式编写,但这是迄今为止使其工作的最小更改:

    <xsl:template match="star.page">
        <xsl:choose>
            <xsl:when test="name(..) = 'label' and name(../../..) = 'list' ">
    
    
    
    编辑1: 虽然上述更改将起作用,但您始终可以用更干净的方式重写整个过程,如下所示:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes"
            encoding="UTF-8" indent="yes"/>
    
        <xsl:template match="/">
            <hmtl>
                <head>
                    <title>New Version!</title>
                </head>
                <xsl:apply-templates/>
            </hmtl>
        </xsl:template>
    
        <xsl:template name="orderedlist" match="list">
            <ol class="eng-orderedlist orderedlist">
                <xsl:apply-templates select="list.item"/>
            </ol>
        </xsl:template>
    
        <xsl:template name="orderitem" match="list.item">
            <xsl:apply-templates select="label/star.page"/>
            <li class="item">
                <div class="para">
                    <span class="item-num">
                       <xsl:for-each select="label/text()">
                           <xsl:value-of select="."/>
                       </xsl:for-each>
                    </span>
                    <xsl:for-each select="text()">
                       <xsl:value-of select="."/>
                    </xsl:for-each>
                </div>
            </li>
        </xsl:template>
    
        <xsl:template match="label/star.page">
            <xsl:text disable-output-escaping="yes">&lt;/ol&gt;</xsl:text>
            <div class="x">
                <xsl:value-of select="."/>
            </div>
            <xsl:text disable-output-escaping="yes">&lt;ol class="eng-orderedlist orderedlist"&gt;</xsl:text>
        </xsl:template>
    
    </xsl:transform>
    
    
    新版本!
    
  • /ol ol class=“eng orderedlist orderedlist”

    Edit2:更新为包含标签的所有文本节点

    ,因此每当您遇到star.page时,您希望ol标签关闭并再次打开吗?并且star.page将始终出现在标签内?嗨,Rnet,感谢您提供的解决方案,我正在使用此
    选择
    ,因为有许多相似的不同节点需要匹配,基于此,我需要关闭相应的父节点。有一点疑问,我想知道
    。[label]
    的意思,我理解
    名称()
    .[label]
    不起作用吗?如果我需要使用那种类型,如何使用。我这样问是因为我想匹配
    嵌套列表
    Thanks@user3872094
    。[label]
    不起作用,因为
    指的是标签本身,您将在
    label
    中搜索
    label
    ,这将始终产生false,因此您需要爬到更高的节点,然后搜索标签<代码>。/…[标签]将起作用。使用
    name(…)
    只需保存一个步骤。哦,现在我明白了。非常感谢你