Xml 通过XSL中的多个递归模板继承属性值

Xml 通过XSL中的多个递归模板继承属性值,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,假设我有一个如下所示的XML文件: <a id="x"> <b> <b> <a id="y"> <b> <c /> </b> </a> </b> <c>

假设我有一个如下所示的XML文件:

<a id="x">
    <b>
        <b>
            <a id="y">
                <b>
                    <c />
                </b>
            </a>
        </b>
        <c>
            <a id="z">
                <b>
                    <c />
                </b>
            </a>
        </c>
    </b>
</a>

经过几个小时的工作,我终于得到了它,这样“a”、“b”和“c”模板就可以正确地递归。我留下的可能是我需要
a/@id
的值在
b
c
中可用。但我还需要能够在到达内部
a
时重置该值。(也就是说,在
a#x>b>a#y>b>c
中,我需要值“y”,但在
a#x>b>b
中,我需要值“x”。换句话说,我需要最新的
a/@id

由于
b
元素可以嵌套不确定的次数,问题变得复杂了,因此这不仅仅是执行
。//../id
或其他操作的情况

因为变量或参数似乎不适用于此,所以我认为一个可接受的解决方法是自动将
@id
带到每个子元素。但是,我无法找到使用
xsl:attribute
实现这一点的方法,因为这似乎总是修改输出树,而不是输入树或当前处理树


有什么提示吗?

你就不能只做
祖先::a[first()]/@id

<xsl:template match="a">
   ...
   <xsl:apply-templates match="*" />
</xsl:template>

<xsl:template match="b">
   <xsl:variable name="id" select="ancestor::a[first()]/@id" />
   ...
   <xsl:apply-templates match="*" />
</xsl:template>

<xsl:template match="b">
   <xsl:variable name="id" select="ancestor::a[first()]/@id" />
   ...
   <xsl:apply-templates match="*" />
</xsl:template>

...
...
...

它实际上是
祖先::a[1]/@id
,但是是的,谢谢!我盯着这个看了这么久,我都记不起我试过什么,没试过什么了。@GPHemsley:Oops。我一时想不起属性语法是什么。现在修好了。你还没有说出你想要达到的目标。