我有个问题。我有一个xml文件,如下所示:

Main.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<msrsw>
  <software>
  <chapter>
     <name> Hello world</sample>
     <xref type="xml">C:\ABC\NestedXML.xml</xref>
  </chapter>
  </software>
</msrsw>


NestedXml.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
 <msrsw>
  <software>
  <chapter>
     <name> Nested XML </sample>
     <age>14</age>
     <country>Canada</country>
  </chapter>
</software>
</msrsw>


我正在使用Apache FOP生成PDF文档(使用Java)。 FOP需要src和dest参数。 Src是Main.xml。
我的XSLT如下:

<xsl:param name="xmlFileName" />
<xsl:param name="XMLFile" select="document($xmlFileName)"/>
<xsl:template name="Chapters_1_2_Template">
    <xsl:apply-templates select="$XMLFile/*" mode="chapter" />
</xsl:template>

    <xsl:template match="node()" mode="chapter">
    <xsl:for-each select="node()">
        <xsl:if test="current()[name() = 'xref']">
            <xsl:apply-templates select="current()[name() = 'xref']" mode="x" />
        </xsl:if>
     <xsl:if test="current()[name() = 'name']">
            <xsl:apply-templates select="current()[name() = 'name']" mode="name" />
        </xsl:if>
     <xsl:if test="current()[name() = 'age']">
            <xsl:apply-templates select="current()[name() = 'age']" mode="age" />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

<xsl:template match="name" mode="name">
    <xsl:value-of select="current()" />
</xsl:template>

<xsl:template match="age" mode="age">
    <xsl:value-of select="current()" />
</xsl:template>

 <xsl:template match="country" mode="country">
    <xsl:value-of select="current()" />
</xsl:template>

<xsl:template match="xref" mode="x">
    <xsl:param name="XMLFile" select="document(current())"/>
    <xsl:call-template name="Chapters_1_2_Template" />
</xsl:template>


当我执行上面的代码时,在<xsl:apply-templates select="$XMLFile/*" mode="chapter" />行中出现以下错误:

Invalid token XMLFile.


当我删除$ XMLFile-<xsl:apply-templates select="*" mode="chapter" />时,它对Main.xml文件的内容很有效。
当我仅在外部参照模板中显示current()的值时,它将解析NestedXml.xml文件并在PDF中显示字符串值。

预期输出为:

Hello world

Nested XML

14

Canada


我的要求是将NestedXML.xml的节点集嵌入在<xref></xref>标记内,然后在该节点集上递归applyTemplates。
但是document()函数为我提供了NestedXml.xml的已解析String内容。

我不想使用document()函数,而只是获得NestedXml.xml的String值。我需要使用相同的XSLT解析NestedXml.xml的所有标签。
请建议我我要去哪里错了。这种方法正确吗?还有其他方法吗?
还是无法使用XSLT以这种方式进行操作,而XSLT仅允许包含已分析的String值?

最佳答案

如果只需要一些文本节点,则样式表不必那么复杂。试试这个更简单的样式表:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
    <xsl:apply-templates select="msrsw/software/chapter/name"/>
    <xsl:apply-templates select="document(msrsw/software/chapter/xref)/*"/>
</xsl:template>
<xsl:template match="text()">
    <xsl:value-of select="normalize-space()"/>
    <xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>

09-11 19:35