Xslt 需要在两个节点之间获取节点值
我必须为两个节点之间的节点应用模板 例Xslt 需要在两个节点之间获取节点值,xslt,Xslt,我必须为两个节点之间的节点应用模板 例 评论 我必须为commentRangeStart和commentRangeEnd之间的节点应用模板。请帮助我编写xslt模板。提前感谢看起来您正在处理并行/重叠标记,其中“commentrangestart”和“commentrangeend”元素充当“里程碑”标记。有大量关于处理重叠标记的文献,花些时间研究这个主题是值得的 细节部分取决于父元素中是否只有一个commentrange,范围是否总是在同一元素中开始和结束,等等 在XSLT2.0中,通常可
评论
我必须为
commentRangeStart
和commentRangeEnd
之间的节点应用模板。请帮助我编写xslt模板。提前感谢看起来您正在处理并行/重叠标记,其中“commentrangestart”和“commentrangeend”元素充当“里程碑”标记。有大量关于处理重叠标记的文献,花些时间研究这个主题是值得的
细节部分取决于父元素中是否只有一个commentrange,范围是否总是在同一元素中开始和结束,等等
在XSLT2.0中,通常可以使用
或
处理此类构造。您还可以使用>运算符,例如
如果您一直坚持使用XSLT1.0,那么这将非常困难,但并非不可能。要使用的技术(值得学习,因为它在XSLT2.0中也很有用)称为“同级递归”。您编写了一个与commentrangestart元素匹配的模板,并执行
;在mode=“sibling”中有两个模板规则,一个匹配commentrangeend元素并终止递归,另一个处理中间的元素,并通过执行递归调用来结束。除了Kay博士的完整答案之外,这里还有一个简单的XPath 1.0(XSLT 1.0)解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="w:w">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select=
"*/w:p/w:commentRangeStart[@w:id=0]
/following-sibling::node()
[following-sibling::w:commentRangeEnd[@w:id=0] ]
"/>
</xsl:template>
</xsl:stylesheet>
<w:r xmlns:w="w:w">
<w:t>Comments</w:t>
</w:r>
当此转换应用于提供的XML文档时(包装到顶部元素中,格式良好):
评论
生成所需的正确结果(将标识模板应用于所选节点):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="w:w">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select=
"*/w:p/w:commentRangeStart[@w:id=0]
/following-sibling::node()
[following-sibling::w:commentRangeEnd[@w:id=0] ]
"/>
</xsl:template>
</xsl:stylesheet>
<w:r xmlns:w="w:w">
<w:t>Comments</w:t>
</w:r>
评论
@vignesh:除了Michael Kay博士的完整解释之外,XSLT 1.0中还有其他使用键的技术:使用fn:generate-id()
将键值声明为前后标记,并在匹配起始标记时检索这些节点。不清楚是要选择这些节点还是要匹配它们(如在模式中)。此外,关于这个分组任务有很多答案……好问题,+1。请参阅我的答案,以获得完整的一行解决方案。@vignesh:我很高兴我的解决方案有用。也许你不知道,至少接受或表决一个答案是表达感激之情的?提示:您可以通过单击旁边的绿色复选标记来接受答案。很高兴收到您的答复。我一直在将docx文件中的列表转换为html(如果列表之间有图像和表格,则很难维护列表顺序)。您有任何xsl模板来执行此操作。这对我来说非常有用。提前谢谢。@vignesh:没有,我从未做过这种转换。为什么不使用Word的“另存为”命令将文件保存为html格式?@Dimitre:ya这是可能的..但我会动态获取文档..因此必须通过xslt进行转换并生成输出..@vignesh:即使您动态获取文档,您仍然可以使用Word自动化,并使Word对象以编程方式将文档另存为html。并不是说我反对用XSLT做这件事——这只是另一种可能的方法。