Xml XSLT:为什么/*/*重写/*/x?

Xml XSLT:为什么/*/*重写/*/x?,xml,xslt,Xml,Xslt,我正在学习XSLT,我有以下问题。我有以下XML: <a> <x>testo 0 <rad>testo 1</rad> </x> <b> <p> <w> <z>testo 2</z> </w> </p> </b> <y> <p/>

我正在学习XSLT,我有以下问题。我有以下XML:

<a>
<x>testo 0
    <rad>testo 1</rad>
</x>
<b>
    <p>
        <w>
            <z>testo 2</z>
        </w>
    </p>
</b>
<y>
    <p/>
    <y>testo 3
        <d>testo 4</d>
    </y>
</y>
<f/>

测试0
testo 1

testo 2

Testo3 Testo4

应使用XSLT 1.0将其转换为thix xml:

<r>
<nx>
<oldx/>
<new>
<rad/>
</new>
</nx>
<b>
<new>
<p/>
</new>
</b>
<new>
<p/>
</new>
<new>
<y/>
</new>
<f/>
</r>

以下是我的尝试:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/*">
        <xsl:element name="r">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="/*/x">
        <nx><xsl:element name="oldx"/>
        <xsl:apply-templates/></nx>
    </xsl:template>
    <xsl:template match="/*/y">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="/*/*">
        <xsl:element name="{name()}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="/*/*/*">
        <new>
            <xsl:element name="{name()}"/>
            <xsl:apply-templates/>
        </new>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="*">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

但是当我应用这个转换时,程序将要翻译x元素,它应用这个模板:/*/*而不是/*/x

我知道/*/*匹配根的每个“子元素”,但据我所知/*/x应该优先于x元素。您能帮助我理解XSLT的错误吗

谢谢你的帮助

编辑: 例如,如果我有以下输入:

<a> <c> <a> 
    <b>1</b>
    <b>2</b>
</a>
    <f><b>3</b>
    </f>
</c>
    <b> <c>4</c> 5 </b>
</a>

1.
2.
3.
4 5 
我应用这个变换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="a">
        <A><xsl:apply-templates/></A> 
    </xsl:template>
    <xsl:template match="b"> 
        <B><xsl:value-of select="."/></B>
    </xsl:template>
    <xsl:template match="c"> 
        <xsl:apply-templates/> 
    </xsl:template>
    <xsl:template match="*"> 
        <xsl:element name="{name()}"><xsl:apply-templates/></xsl:element>
    </xsl:template>
</xsl:stylesheet>


元素“a”、“b”、“c”如我所料匹配。答案是两者都没有优先级。查看XSLT建议,了解模板优先级如何工作的详细信息(它远没有您预期的复杂),以及在有疑问时明确设置优先级

或者,根据2.0规范,但本质上相同,并且可能更可读:


答案是两者都没有优先权。查看XSLT建议,了解模板优先级如何工作的详细信息(它远没有您预期的复杂),以及在有疑问时明确设置优先级

或者,根据2.0规范,但本质上相同,并且可能更可读:


如何“明确设置优先级”?请将
元素上的
优先级属性设置为高于或低于默认值(或更具体地说,冲突元素的值)@keshlam:谢谢您的回复。你能看看我在第一篇文章末尾所做的编辑吗?谢谢请不要编辑帖子来添加补充问题。如果问题在答案写出来后已经改变了,那么尝试跟随一条线索是没有希望的。回答问题后,只需编辑它以修复简单错误。对于补充问题,如果无法通过评论处理,请开始新的帖子。如何“明确设置优先级”?将
元素上的
priority
属性设置为高于或低于默认值(或者更具体地说,冲突元素的值)@keshlam:谢谢您的回复。你能看看我在第一篇文章末尾所做的编辑吗?谢谢请不要编辑帖子来添加补充问题。如果问题在答案写出来后已经改变了,那么尝试跟随一条线索是没有希望的。回答问题后,只需编辑它以修复简单错误。对于补充问题,如果无法通过评论进行处理,请开始新的帖子。