同一XSLT中的引用名称空间

时间:2014-11-26 15:37:24

标签: xslt

尝试使用document('')将命名空间引用到相同的 xslt ,但我得到:

 SystemID: file:/c:/intersystems/cache/mgr/samples/; Line#: 1; Column#: 1
net.sf.saxon.trans.XPathException: Error reported by XML parser

...

Caused by: org.xml.sax.SAXParseException; systemId: file:/c:/intersystems/cache/mgr/samples/; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)

所以似乎无法引用相同的 xslt ?有没有办法做到这一点

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:csv="csv:csv">
<!-- <xsl:output method="text" version="4.0" encoding="iso-8859-1" indent="yes"/> -->
<xsl:strip-space elements="*" />
<xsl:output method="text" encoding="utf-8" />
<xsl:variable name="delimiter" select="','"/>

<csv:columns>
<column>GlobalID</column>
<column>ServicePointName</column>
</csv:columns>

  <xsl:template match="/Report">
        <!-- Output the CSV header -->
          ****<xsl:for-each select="document('')/*/csv:columns/*">****
                <xsl:value-of select="."/>
                <xsl:if test="position() != last()">
                    <xsl:value-of select="$delimiter"/>
                </xsl:if>
        </xsl:for-each> 
        <xsl:text>&#xa;</xsl:text>

        <!-- Output rows for each matched Report -->
        <xsl:apply-templates select="*" />
    </xsl:template>

    <xsl:template match="/Report/CLI">
            <xsl:for-each select="//CLI">
                        <xsl:value-of select="GlobalID"/>
                        <xsl:value-of select="$delimiter"/>
                        <xsl:value-of select="ServicePointName"/>
                        <!-- Add a newline at the end of the record -->
                        <xsl:text>&#xa;</xsl:text>
             </xsl:for-each>


     </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:0)

Saxon 9是一个XSLT 2.0处理器 - 所以你可以很容易地做到:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:variable name="delimiter" select="','"/>

<xsl:variable name="columns">
    <column>GlobalID</column>
    <column>ServicePointName</column>
</xsl:variable>

<xsl:template match="/">
    <xsl:for-each select="$columns/*">
        <xsl:value-of select="."/>
        <xsl:if test="position() != last()">
            <xsl:value-of select="$delimiter"/>
        </xsl:if>
    </xsl:for-each> 
    <xsl:text>&#xa;</xsl:text>

    <!-- the rest -->

</xsl:template>

</xsl:stylesheet>

我没有看到您在样式表中进一步使用了这些列。如果是这样,为什么不简化整个事情:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/"> 
    <xsl:text>GlobalID,ServicePointName&#xa;</xsl:text>

    <!-- the rest -->

</xsl:template>

</xsl:stylesheet>

(也兼容XSLT 1.0)。

这些都不能解释您尝试使用内部节点的原因。

答案 1 :(得分:-1)

我从来没有尝试过这样做,只是看document()函数的documentation就是这样说的:

document()  Used to access the nodes in an external XML document

编辑:我按照以下评论的指示跳了起来。还有另一个问题面临同样的问题:

XSLT document('') function doesn't work