无法使用XSLT匹配模式
我在下面介绍了XML无法使用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 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"></ol></xsl:text>
<div class="x">
<xsl:value-of select="."/>
</div>
<xsl:text disable-output-escaping="yes"><ol class="eng-orderedlist orderedlist"></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(…)
只需保存一个步骤。哦,现在我明白了。非常感谢你