我有问题。我有一个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 params。 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文件的内容效果很好。
当我只在xref模板中显示current()的值时,它会解析NestedXml.xml文件并以PDF格式显示字符串值。
预期输出为:
Hello world
Nested XML
14
Canada
我的要求是将NestedXML.xml的节点集嵌入<xref></xref>
标记中,并在该节点集上递归applyTemplates。
但document()函数为我提供了NestedXml.xml的解析字符串内容。
我不想使用document()函数,只需获取NestedXml.xml的String值。我需要使用相同的XSLT解析NestedXml.xml的所有标记 请建议我哪里出错了。这种方法对吗?有没有其他方法可以做到这一点? 或者使用XSLT无法以这种方式执行,并且XSLT只允许包含已解析的String值?
答案 0 :(得分:0)
如果只是想要一些文本节点,那么样式表就不那么复杂了。试试这个更简单的样式表:
<?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>