设置路径时// .//
有什么区别?
第二个问题,如果我想在 for-each 块中获取父节点的一些信息,我该如何获取?
最佳答案
//
是后代轴的缩写。
如果你说 //para
,它会选择整个文档中的所有 para
元素。
当你说 .//para
时,所有作为上下文节点后代的 para
元素都被选中。
为了演示,请考虑以下 XML:
<l1>
<para>1</para>
<l2>
<para>2</para>
<l3>
<para>3</para>
</l3>
</l2>
</l1>
和这个 XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/l1">
<output>
<xsl:apply-templates select="l2"/>
</output>
</xsl:template>
<xsl:template match="l2">
<para-all>
<xsl:copy-of select="//para"/>
</para-all>
<para-context>
<xsl:copy-of select=".//para"/>
</para-context>
<parent>
<xsl:value-of select="name(parent::*)"/>
</parent>
</xsl:template>
</xsl:stylesheet>
您将获得的输出是:
<?xml version="1.0" encoding="utf-8"?>
<output>
<para-all>
<para>1</para>
<para>2</para>
<para>3</para>
</para-all>
<para-context>
<para>2</para>
<para>3</para>
</para-context>
<parent>l1</parent>
</output>
para-all
获取文档中的所有 para
,而 para-context
仅获取那些 para
的后代(上下文节点)以及如何选择父级,如代码中所示(参见 XSLT 中的
l2
元素)。在上面的示例中,上下文节点是
parent
并且通过使用父轴,正在写入父元素的名称。您可以使用
l2
或 parent::*
关于XSLT 选择// 和 .//,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27125335/