Я получаю предупреждение
неоднозначное совпадение правил
от процессора для шаблонов copyReference и преобразование идентичности .
<xsl:template name="processChildNodes">
<xsl:param name="El"/>
<xsl:for-each select="$El/node()">
<xsl:choose>
<xsl:when test="@sameas">
<xsl:apply-templates mode="copyReference" select="id(substring-after(@sameas, '#'))"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template match="*" mode="copyReference" name="copyReference">
<xsl:copy>
<xsl:apply-templates select="@* except (@stem.dir, @stem.sameas)"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node() | @*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
Вот фрагмент XML:
<layer>
<note oct="3" pname="b" stem.dir="up" stem.sameas="#note_17544b" xml:id="note_17544"/>
</layer>
<layer>
<note oct="4" pname="d" xml:id="note_17592"/>
<note sameas="#note_17544" xml:id="note_17544b"/>
</layer>
Я хочу просто скопировать узел, на который ссылается атрибут @ sameas, без @stem. dir и @ stem.sameas. Могут быть разные узлы local-names (), к которым будет применяться. Поэтому я бы не стал указывать имена узлов в атрибуте @ match шаблона copyReference . Я думал, что если я пропущу нужные мне узлы с помощью @ select-attribute, а также добавлю @mode, он будет соответствовать только тому, что мне нужно. И на самом деле это работает, но когда я получаю предупреждение, что-то должно быть не так.