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做这件事——这只是另一种可能的方法。