Влияет ли имя шаблона xsl: на результат функции fn: key , и почему? большое спасибо

Я считаю, что не могу получить правильный результат с помощью функции fn: key в шаблоне с атрибутом name. Когда я просто удаляю атрибут name xsl: template, результат правильный. Это меня поражает. Кто-нибудь хочет назвать причину? Благодарю.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"

xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships"
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:v="urn:schemas-microsoft-com:vml"

xmlns:map = "http://www.w3.org/2005/xpath-functions/map"
exclude-result-prefixes="xs w rel r map"
version="2.0">

<xsl:key name="key_styles_id" match="w:style" use="@w:styleId"/>

<xsl:template match="/">
    <xsl:variable name="styles" select="doc(resolve-uri('styles.xml',    document-uri(/)))" as="document-node()?"/>

    <xsl:apply-templates select="w:document/w:body/w:p">
        <xsl:with-param name="styles" tunnel="yes" select="$styles"/>
    </xsl:apply-templates>        
</xsl:template>

<xsl:template name="all_paragraph" match="w:p">
    <xsl:param name="styles" tunnel="yes" required="yes" />

    <xsl:value-of select="$styles"/>

    <xsl:variable name="style_id" select="w:pPr/w:pStyle/@w:val" as="xs:string?"/>
    <xsl:variable name="style_node" select="key('key_styles_id', $style_id, $styles)"/>
    <xsl:value-of select="$style_node"/>
</xsl:template>  

</xsl:stylesheet>

Входной xml является documment.xml в каталоге распакованного docx, файл docx может быть заменен файлом, в котором есть несколько слов со стилями.

Проблема в том, что: если я удалю атрибут name, значение которого равно all_paragraph, ключевая функция получит правильный результат, а в $ style_node будет много данных элементов. в противном случае ключевая функция возвращает пустое значение, а в $ style_node ничего нет.

Я использую процессор xslt saxon-he 9.8.0.12.

источник ввода: document.xml

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
    xmlns:v="urn:schemas-microsoft-com:vml"
    xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
    xmlns:w10="urn:schemas-microsoft-com:office:word"
    xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
    xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
    xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
    xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" mc:Ignorable="w14 wp14">
    <w:body>
        <w:p>
            <w:pPr>
                <w:pStyle w:val="Normal"/>
                <w:rPr>
                    <w:b/>
                    <w:b/>
                    <w:bCs/>
                    <w:color w:val="C9211E"/>
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:b/>
                    <w:bCs/>
                    <w:color w:val="C9211E"/>
                </w:rPr>
                <w:t xml:space="preserve">12345good day. </w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:pStyle w:val="Normal"/>
                <w:rPr>
                    <w:i/>
                    <w:i/>
                    <w:iCs/>
                    <w:color w:val="77BC65"/>
                    <w:sz w:val="28"/>
                    <w:szCs w:val="28"/>
                    <w:highlight w:val="yellow"/>
                </w:rPr>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:i/>
                    <w:iCs/>
                    <w:color w:val="77BC65"/>
                    <w:sz w:val="28"/>
                    <w:szCs w:val="28"/>
                    <w:highlight w:val="yellow"/>
                </w:rPr>
                <w:t>64789hello world</w:t>
            </w:r>
        </w:p>
        <w:sectPr>
            <w:type w:val="nextPage"/>
            <w:pgSz w:w="11906" w:h="16838"/>
            <w:pgMar w:left="1134" w:right="1134" w:header="0" w:top="1134" w:footer="0"
                w:bottom="1134" w:gutter="0"/>
            <w:pgNumType w:fmt="decimal"/>
            <w:formProt w:val="false"/>
            <w:textDirection w:val="lrTb"/>
        </w:sectPr>
    </w:body>
</w:document>

styles.xml, который используется в коде xslt, например doc('styles.xml')

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
    xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="w14">
    <w:docDefaults>
        <w:rPrDefault>
            <w:rPr>
                <w:rFonts w:ascii="Liberation Serif" w:hAnsi="Liberation Serif" w:eastAsia="新宋体"
                    w:cs="Lucida Sans"/>
                <w:kern w:val="2"/>
                <w:sz w:val="24"/>
                <w:szCs w:val="24"/>
                <w:lang w:val="en-US" w:eastAsia="zh-CN" w:bidi="hi-IN"/>
            </w:rPr>
        </w:rPrDefault>
        <w:pPrDefault>
            <w:pPr>
                <w:widowControl/>
            </w:pPr>
        </w:pPrDefault>
    </w:docDefaults>
    <w:style w:type="paragraph" w:styleId="Normal">
        <w:name w:val="Normal"/>
        <w:qFormat/>
        <w:pPr>
            <w:widowControl/>
        </w:pPr>
        <w:rPr>
            <w:rFonts w:ascii="Liberation Serif" w:hAnsi="Liberation Serif" w:eastAsia="新宋体"
                w:cs="Lucida Sans"/>
            <w:color w:val="auto"/>
            <w:kern w:val="2"/>
            <w:sz w:val="24"/>
            <w:szCs w:val="24"/>
            <w:lang w:val="en-US" w:eastAsia="zh-CN" w:bidi="hi-IN"/>
        </w:rPr>
    </w:style>
    <w:style w:type="paragraph" w:styleId="Style14">
        <w:name w:val="标题样式"/>
        <w:basedOn w:val="Normal"/>
        <w:next w:val="Style15"/>
        <w:qFormat/>
        <w:pPr>
            <w:keepNext w:val="true"/>
            <w:spacing w:before="240" w:after="120"/>
        </w:pPr>
        <w:rPr>
            <w:rFonts w:ascii="Liberation Sans" w:hAnsi="Liberation Sans" w:eastAsia="微软雅黑"
                w:cs="Lucida Sans"/>
            <w:sz w:val="28"/>
            <w:szCs w:val="28"/>
        </w:rPr>
    </w:style>
    <w:style w:type="paragraph" w:styleId="Style15">
        <w:name w:val="Body Text"/>
        <w:basedOn w:val="Normal"/>
        <w:pPr>
            <w:spacing w:lineRule="auto" w:line="276" w:before="0" w:after="140"/>
        </w:pPr>
        <w:rPr/>
    </w:style>
    <w:style w:type="paragraph" w:styleId="Style16">
        <w:name w:val="List"/>
        <w:basedOn w:val="Style15"/>
        <w:pPr/>
        <w:rPr>
            <w:rFonts w:cs="Lucida Sans"/>
        </w:rPr>
    </w:style>
    <w:style w:type="paragraph" w:styleId="Style17">
        <w:name w:val="Caption"/>
        <w:basedOn w:val="Normal"/>
        <w:qFormat/>
        <w:pPr>
            <w:suppressLineNumbers/>
            <w:spacing w:before="120" w:after="120"/>
        </w:pPr>
        <w:rPr>
            <w:rFonts w:cs="Lucida Sans"/>
            <w:i/>
            <w:iCs/>
            <w:sz w:val="24"/>
            <w:szCs w:val="24"/>
        </w:rPr>
    </w:style>
    <w:style w:type="paragraph" w:styleId="Style18">
        <w:name w:val="索引"/>
        <w:basedOn w:val="Normal"/>
        <w:qFormat/>
        <w:pPr>
            <w:suppressLineNumbers/>
        </w:pPr>
        <w:rPr>
            <w:rFonts w:cs="Lucida Sans"/>
        </w:rPr>
    </w:style>
</w:styles>

мои скриншоты:

первый результат с атрибутом имени

2-й результат без атрибута имени


person cmf41013    schedule 03.12.2019    source источник
comment
Рассмотрите возможность показать минимальные, но полные образцы XML, XSLT и вывода, которые вы получаете, по сравнению с тем, который вы хотите, чтобы мы могли воспроизвести проблему. Неясно, как вы используете функцию key и как вы используете шаблон, именованный шаблон, если используется имя, вызывается xsl:call-template, без имени, он используется, если xsl:apply-templates обрабатывает узел, соответствующий шаблону match .   -  person Martin Honnen    schedule 03.12.2019
comment
@MartinHonnen , привет, я разместил свой код и подробнее проиллюстрирую свой вопрос. Благодарю.   -  person cmf41013    schedule 04.12.2019
comment
Я не понимаю, почему удаление или поддержание атрибута name в xsl:template должно изменить поведение кода, который полагается на xsl:apply-templates. Если вы можете добавить минимальные, но полные образцы двух входных документов, которые показывают сбой, чтобы другие могли воспроизвести его, мы могли бы рассказать больше.   -  person Martin Honnen    schedule 04.12.2019
comment
Проблема просто зависит от атрибута name, который мне, вероятно, не нужен.   -  person cmf41013    schedule 04.12.2019
comment
@MartinHonnen, входные документы легко сгенерировать, создайте файл .docx, добавьте в него какое-то слово, затем измените их цвет или размер шрифта, стиль шрифта, чтобы файл docx имел данные стиля. Затем переименуйте файл docx в zip-файл и заархивируйте его, файлы document.xml и sytles.xml появятся в папке word по разархивированному пути. Я не знаю, как загрузить файл.   -  person cmf41013    schedule 04.12.2019
comment
В мою задачу не входит придумывать образцы для воспроизведения вашей проблемы, пожалуйста, добавьте минимальные образцы в качестве фрагментов кода к вашему вопросу, и мы сможем взять его оттуда.   -  person Martin Honnen    schedule 04.12.2019
comment
Нет, это мое, потому что я думаю, что его легко сгенерировать по ошибке. Я выкладываю данные входного исходного файла. @MartinHonnen   -  person cmf41013    schedule 04.12.2019
comment
Какой вывод вы хотите произвести с помощью <xsl:value-of select="$style_node"/>, учитывая, что эта инструкция создаст текстовый узел со строковыми значениями выбранного узла (ов) и учитывая, что ваши элементы несут данные только в атрибутах? Как бы то ни было, я заменил value-of на copy-of, но в ходе быстрого теста я не заметил никакой разницы между XSLT с атрибутом name в шаблоне или без него, оба возвращают два элемента w:style.   -  person Martin Honnen    schedule 04.12.2019
comment
@MartinHonnen, я опубликовал свои скриншоты с разными результатами. пожалуйста, посмотрите их.   -  person cmf41013    schedule 04.12.2019
comment
какой процессор xslt вы используете?   -  person cmf41013    schedule 04.12.2019
comment
Извините, я не могу отладить скриншоты, спросите ребят oXygen на их форумах поддержки, есть ли у них объяснение. Я тестировал онлайн на xsltfiddle.liberty-development.net/ncntCSu/2 и xsltfiddle.liberty-development.net/ncntCSu/3, этот инструмент использует Saxon 9.8.0.15 HE , и для тестирования я вложил туда второй документ.   -  person Martin Honnen    schedule 04.12.2019
comment
код <xsl:value-of select="$styles"/> и <xsl:value-of select="$style_node"/> только для отладки, они не имеют значения.   -  person cmf41013    schedule 04.12.2019
comment
@MartinHonnen, хорошо, спасибо вам большое.   -  person cmf41013    schedule 04.12.2019
comment
Простите, как установить два входных xml в xsltfiddle.liberty-development.net? @MartinHonnen   -  person cmf41013    schedule 04.12.2019
comment
В примерах, которые я связал с дополнительным входным документом, он встроен. Вы также можете загрузить его с помощью функции doc, но с сервера HTTP (S), например. doc('http://example.com/styles.xml') при необходимости локальный / относительный URIS не будет работать.   -  person Martin Honnen    schedule 04.12.2019
comment
@MartinHonnen, Еще раз спасибо, ты такой добрый.   -  person cmf41013    schedule 04.12.2019