设置路径时// .//有什么区别?
第二个问题,如果我想在 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 并且通过使用父轴,正在写入父元素的名称。
您可以使用 l2parent::*

关于XSLT 选择//​​ 和 .//,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27125335/

10-12 00:13