关于 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>
我的问题是“<xsl:variable name="t">
”变量没有明确的类型声明。
我知道"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>
我的问题是“<xsl:variable name="t">
”变量没有明确的类型声明。