Я считаю, что не могу получить правильный результат с помощью функции 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>
мои скриншоты:
key
и как вы используете шаблон, именованный шаблон, если используется имя, вызываетсяxsl:call-template
, без имени, он используется, еслиxsl:apply-templates
обрабатывает узел, соответствующий шаблонуmatch
. - person Martin Honnen   schedule 03.12.2019name
вxsl:template
должно изменить поведение кода, который полагается наxsl:apply-templates
. Если вы можете добавить минимальные, но полные образцы двух входных документов, которые показывают сбой, чтобы другие могли воспроизвести его, мы могли бы рассказать больше. - person Martin Honnen   schedule 04.12.2019<xsl:value-of select="$style_node"/>
, учитывая, что эта инструкция создаст текстовый узел со строковыми значениями выбранного узла (ов) и учитывая, что ваши элементы несут данные только в атрибутах? Как бы то ни было, я заменил value-of на copy-of, но в ходе быстрого теста я не заметил никакой разницы между XSLT с атрибутомname
в шаблоне или без него, оба возвращают два элементаw:style
. - person Martin Honnen   schedule 04.12.2019<xsl:value-of select="$styles"/>
и<xsl:value-of select="$style_node"/>
только для отладки, они не имеют значения. - person cmf41013   schedule 04.12.2019doc
, но с сервера HTTP (S), например.doc('http://example.com/styles.xml')
при необходимости локальный / относительный URIS не будет работать. - person Martin Honnen   schedule 04.12.2019