XSLT2.0基于自动关闭元素之间的内容输出html列表
在我的XML文档中,我在文本中对里程碑进行了编码,并使用一个自动关闭元素进行编码。因此,这样的文本:XSLT2.0基于自动关闭元素之间的内容输出html列表,xslt,xslt-2.0,Xslt,Xslt 2.0,在我的XML文档中,我在文本中对里程碑进行了编码,并使用一个自动关闭元素进行编码。因此,这样的文本: <p> <seg><milestone n="1"/>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt <milestone n="2"/>ut labore et dolore magna al
<p>
<seg><milestone n="1"/>Lorem ipsum dolor sit amet, consectetur adipiscing
elit, sed do eiusmod tempor incididunt <milestone n="2"/>ut labore
et dolore magna aliqua. Ut <quote>enim <note>ad</note></quote> minim <milestone n="3"/>veniam,
quis nostrud exercitation <milestone n="4"/>ullamco laboris nisi
ut aliquip ex ea commodo</seg>
<seg>consequat. Duis aute irure dolor
<milestone n="5"/> in reprehenderit <quote>in</quote> voluptate velit esse cillum
dolore eu fugiat nulla pariatur.</seg>
</p>
下面的示例基于但不起作用
<xsl:template match="p" mode="diplo">
<xsl:for-each-group select="node()" group-starting-with="milestone">
<li>
<xsl:sequence select="current()/ancestor::p//milestone/@*"/>
<xsl:apply-templates select="current-group()[not(self::milestone)]"/>
</li>
</xsl:for-each-group>
</xsl:template>
编辑:我已经更新了XML源代码,使其更加清晰,我不希望只使用文本,而是希望使用应用模板对所有节点进行进一步处理,并发布了一个失败的尝试
提前感谢。您需要为每个组和@组使用以下内容:
XSLT2.0:
输入:
输出:
我认为,从p元素开始,您需要将子节点分组,因为里程碑不是p元素的子节点,因此显示并输出li项。对于其余部分,您需要更具体地指定要处理哪些节点以及将哪些输出传输到哪个节点,因为在处理了不同级别的所有子体之后,就不那么简单了。我注意到您使用了XSLT 3.0,不是2.0…这是真的,因为该工具使用Saxon 9.8,这是一个XSLT 3处理器,但是带有输入片段的示例和相关代码给出了与XSLT 2处理器相同的结果,因为eXist我目前仅限于XSLT 2.0…直到eXist 5准备好生产。这是令人沮丧的,因为我是通过3.0学习XSLT的。我理解并看到了XSLT 2.0标记,但正如我所说的,分组的建议是XSLT 2兼容的,每个分组的分组节点在XSLT 2和3之间没有任何变化,除非我们讨论流。请参阅前面提到的修改XSLT链接:谢谢,但这并不能正确地解决这个问题。输出不应为的文本值,但应允许通过应用模板进行进一步处理。请看我在哪里写的,但允许通过其他节点进行进一步处理。您是指所有节点吗?然后使用copy of而不是value-of。以您的示例为例,我删除了不必要的排序,但添加了两个模板来转换和。但是这些模板并没有启动:现在您需要xsl:apply模板以及我在新创建的模板中观察到的另一件事
<xsl:template match="p" mode="diplo">
<xsl:for-each-group select="node()" group-starting-with="milestone">
<li>
<xsl:sequence select="current()/ancestor::p//milestone/@*"/>
<xsl:apply-templates select="current-group()[not(self::milestone)]"/>
</li>
</xsl:for-each-group>
</xsl:template>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="p">
<p>
<xsl:for-each-group select="seg/node()" group-starting-with="milestone">
<xsl:sort select="@n"/>
<li>
<!--<xsl:value-of select="normalize-space(string-join(current-group(),' '))"/>-->
<xsl:apply-templates select="current-group()[not(self::milestone)]"/>
</li>
</xsl:for-each-group>
</p>
</xsl:template>
<xsl:template match="quote">
<xsl:text>"</xsl:text><xsl:apply-templates/><xsl:text>"</xsl:text> <!--output contents of <quote> in " " -->
</xsl:template>
<xsl:template match="note">
<xsl:text>[</xsl:text><xsl:apply-templates/><xsl:text>]</xsl:text> <!--output contents of <note> in [ ] -->
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<p>
<seg><milestone n="1"/>Lorem ipsum dolor sit amet, consectetur adipiscing
elit, sed do eiusmod tempor incididunt <milestone n="2"/>ut labore
et dolore magna aliqua. Ut <quote>enim <note>ad</note></quote> minim <milestone n="3"/>veniam,
quis nostrud exercitation <milestone n="4"/>ullamco laboris nisi
ut aliquip ex ea commodo</seg>
<seg>consequat. Duis aute irure dolor
<milestone n="5"/> in reprehenderit <quote>in</quote> voluptate velit esse cillum
dolore eu fugiat nulla pariatur.</seg>
</p>
<?xml version="1.0" encoding="UTF-8"?>
<p>
<li>Lorem ipsum dolor sit amet, consectetur adipiscing
elit, sed do eiusmod tempor incididunt </li>
<li>ut labore
et dolore magna aliqua. Ut "enim [ad]" minim </li>
<li>veniam,
quis nostrud exercitation </li>
<li>ullamco laboris nisi
ut aliquip ex ea commodoconsequat. Duis aute irure dolor
</li>
<li> in reprehenderit "in" voluptate velit esse cillum
dolore eu fugiat nulla pariatur.</li>
</p>