关于 xsl:template 返回 xsl:map 的问题

Quetion about the xsl:template returning a xsl:map

我知道"Cannot add a map to an XML tree",特别是把xsl:map作为结果文档。 但是,如果我将 xsl:template 分配给一个变量,它可以将 xsl:map 作为 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:map="http://www.w3.org/2005/xpath-functions/map"

exclude-result-prefixes="xs"
version="3.0">

<xsl:template match="/">
    <xsl:variable name="m1" as="map(*)">
        <xsl:call-template name="tmap1"/>
    </xsl:variable>

    <xsl:variable name="m2" as="map(*)">
        <xsl:call-template name="tmap2"/>
    </xsl:variable>
</xsl:template>

<xsl:template name="tmap1">
    <xsl:sequence select="map{1:'abc', 2:'ccd'}"/>
</xsl:template>

<xsl:template name="tmap2" as="map(*)">
    <xsl:map>
        <xsl:map-entry key="'Mo'" select="'Monday'"/>
        <xsl:map-entry key="'Tu'" select="'Tuesday'"/>
        <xsl:map-entry key="'We'" select="'Wednesday'"/>
        <xsl:map-entry key="'Th'" select="'Thursday'"/>
        <xsl:map-entry key="'Fr'" select="'Friday'"/>
        <xsl:map-entry key="'Sa'" select="'Saturday'"/>
        <xsl:map-entry key="'Su'" select="'Sunday'"/>
        <xsl:map-entry key="'z2'" select="'day'"/>
    </xsl:map>
</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 v"
version="3.0">    

<xsl:template match="/">
    <xsl:apply-templates select="w:document/w:body/w:p"/>
</xsl:template>

<xsl:template match="w:p">
    <xsl:element name="p">
        <xsl:variable name="p_css" as="map(*)*">
            <xsl:if test="w:pPr">
                <xsl:variable name="t">
                    <xsl:apply-templates select="w:pPr" mode="style_item"/>
                </xsl:variable>
                <xsl:if test="not($t instance of map(*))">
                    <xsl:message>error</xsl:message>
                </xsl:if>
            </xsl:if>
        </xsl:variable>

        <xsl:if test="not(empty($p_css))">
            <xsl:where-populated>
                <xsl:attribute name="style" select="$p_css?2"/>
            </xsl:where-populated>
        </xsl:if>
        <xsl:apply-templates select="w:t"/>
    </xsl:element>
</xsl:template>

<xsl:template match="w:pPr" mode="style_item" as="map(*)*">
    <xsl:sequence select="map{1:'hi', 2:'hello', 3:'world'}"/>
</xsl:template>

</xsl:stylesheet>

源文档:

<?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:rsidR="00F708CA" w:rsidRDefault="00F708CA" w:rsidP="006E4E72">
        <w:pPr>
            <w:outlineLvl w:val="0"/>
        </w:pPr>
        <w:r>
            <w:rPr>
                <w:rFonts w:hint="eastAsia"/>
            </w:rPr>
            <w:t>你好,大家好。</w:t>
        </w:r>
        <w:bookmarkStart w:id="0" w:name="_GoBack"/>
        <w:bookmarkEnd w:id="0"/>
    </w:p>
    <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>

错误显示"Cannot add a map to an XML tree"时运行时, 我的 xslt 处理器是 saxon-he 9.8.0.12

如果你想要一个结果(主要或次要)到 show/serialize 地图然后使用输出方法 adaptive(或者 json 如果地图代表 JSON)对于该结果:

<xsl:output method="adaptive" indent="yes"/>

<xsl:template match="/">
    <xsl:variable name="m1" as="map(*)">
        <xsl:call-template name="tmap1"/>

    </xsl:variable>

    <xsl:variable name="m2" as="map(*)">
        <xsl:call-template name="tmap2"/>
    </xsl:variable>

    <xsl:sequence select="$m1, $m2"/>
</xsl:template>

https://xsltfiddle.liberty-development.net/gWEamLu

<xsl:output method="json" indent="yes"/>

<xsl:template match="/">
    <xsl:variable name="m1" as="map(*)">
        <xsl:call-template name="tmap1"/>
    </xsl:variable>

    <xsl:variable name="m2" as="map(*)">
        <xsl:call-template name="tmap2"/>
    </xsl:variable>

    <xsl:sequence select="[$m1, $m2]"/>
</xsl:template>

https://xsltfiddle.liberty-development.net/gWEamLu/1

我的问题是“<xsl:variable name="t">”变量没有明确的类型声明。