Если вы хотите пропустить элементы-потомки и скопировать определенный элемент, у вас есть две опции, используйте xsl:mode on-no-match="shallow-skip"
по умолчанию, а затем напишите шаблон для uri
элементов, которые будут скопированы:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-skip"/>
<xsl:template match="mixed-citation">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="mixed-citation//text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
<xsl:template match="mixed-citation//uri">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / eiZQaFi
или используйте shallow-copy
в качестве значения по умолчанию, а затем убедитесь, что вы переопределите его для descendants
, отличного от uri
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="mixed-citation">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="mixed-citation//text()">
<xsl:value-of select="normalize-space()"/>
</xsl:template>
<xsl:template match="mixed-citation//*[not(self::uri)]">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty -development.net / eiZQaFi / 1
Если вы используете более ранние версии, тогда текущую версию 3 XSLT смотрите в https://www.w3.org/TR/xslt-30/#built-in-templates-shallow-skip о том, как используемые объявления xsl:mode
преобразуются в шаблоны, например. вместо
<xsl:mode on-no-match="shallow-skip"/>
вы можете использовать
<xsl:template match="*"><xsl:apply-templates/></xsl:template>
и shallow-copy
преобразуется в известный шаблон преобразования идентификаторов.