/ / XSLT - простори імен, що не посилаються, все ще розповсюджуються при використанні просторів копій імен = «ні» - xslt, просторів імен, marklogic

XSLT - файли імен, що не мають посилання на посилання, як і раніше поширюються при використанні копію-namespaces = "no" - xslt, простір імен, marklogic

Чому "copy-namespaces =" no "не видаляє декларацію простору імен, на яку не посилаються у виході XSLT?

Зразок введення

<root xmlns:temp="http://temp" xmlns:keep="http://keep">
<wrapper><temp:x>A</temp:x>BC<temp:x>D</temp:x></wrapper>
<keep:me>XYZ</keep:me>
</root>

Зразок XSL

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:temp="http://temp"
xmlns:keep="http://keep"
exclude-result-prefixes="#all">

<xsl:template match="node()|@*" priority="-1" mode="#all">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>

<xsl:template match="temp:x">
<xsl:apply-templates />
</xsl:template>

</xsl:stylesheet>

Очікуваний результат

<root xmlns:keep="http://keep">
<wrapper>ABCD</wrapper>
<keep:me>XYZ</keep:me>
</root>

Фактичний висновок

<root xmlns:temp="http://temp" xmlns:keep="http://keep">
<wrapper>ABCD</wrapper>
<keep:me>XYZ</keep:me>
</root>

Відповіді:

3 для відповіді № 1

Я підтвердив підтримку MarkLogic, що це помилка, і вони працюють над виправленням.

Тим часом я використовую ці шаблони замість шаблону ідентичності як обхідний шлях:

<xsl:template match="*" priority="-1" mode="#all">
<xsl:element name="{name(.)}">
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:element>
</xsl:template>

<xsl:template match="@*" priority="-1" mode="#all">
<xsl:attribute name="{name(.)}" select="."/>
</xsl:template>

<xsl:template match="comment()|processing-instruction()|text()" priority="-1" mode="#all">
<xsl:copy/>
</xsl:template>