我正在从xslt cookbook
开始研究这个问题输入my.xml
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person name="Al Zehtooney" age="33" sex="m" smoker="no"/>
<person name="Brad York" age="38" sex="m" smoker="yes"/>
<person name="Charles Xavier" age="32" sex="m" smoker="no"/>
<person name="David Williams" age="33" sex="m" smoker="no"/>
<person name="Edward Ulster" age="33" sex="m" smoker="yes"/>
<person name="Frank Townsend" age="35" sex="m" smoker="no"/>
<person name="Greg Sutter" age="40" sex="m" smoker="no"/>
<person name="Harry Rogers" age="37" sex="m" smoker="no"/>
<person name="John Quincy" age="43" sex="m" smoker="yes"/>
<person name="Kent Peterson" age="31" sex="m" smoker="no"/>
<person name="Larry Newell" age="23" sex="m" smoker="no"/>
<person name="Max Milton" age="22" sex="m" smoker="no"/>
<person name="Norman Lamagna" age="30" sex="m" smoker="no"/>
<person name="Ollie Kensington" age="44" sex="m" smoker="no"/>
<person name="John Frank" age="24" sex="m" smoker="no"/>
<person name="Mary Williams" age="33" sex="f" smoker="no"/>
<person name="Jane Frank" age="38" sex="f" smoker="yes"/>
<person name="Jo Peterson" age="32" sex="f" smoker="no"/>
<person name="Angie Frost" age="33" sex="f" smoker="no"/>
<person name="Betty Bates" age="33" sex="f" smoker="no"/>
<person name="Connie Date" age="35" sex="f" smoker="no"/>
<person name="Donna Finster" age="20" sex="f" smoker="no"/>
<person name="Esther Gates" age="37" sex="f" smoker="no"/>
<person name="Fanny Hill" age="33" sex="f" smoker="yes"/>
<person name="Geta Iota" age="27" sex="f" smoker="no"/>
<person name="Hillary Johnson" age="22" sex="f" smoker="no"/>
<person name="Ingrid Kent" age="21" sex="f" smoker="no"/>
<person name="Jill Larson" age="20" sex="f" smoker="no"/>
<person name="Kim Mulrooney" age="41" sex="f" smoker="no"/>
<person name="Lisa Nevins" age="21" sex="f" smoker="no"/>
</people>
输入generic-attr-to-csv.xslt
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:csv="http://www.ora.com/XSLTCookbook/namespaces/csv">
<xsl:param name="delimiter" select=" ',' "/>
<xsl:output method="text" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="$columns">
<xsl:value-of select="@name"/>
<xsl:if test="position( ) != last( )">
<xsl:value-of select="$delimiter/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/*/*">
<xsl:variable name="row" select="."/>
<xsl:for-each select="$columns">
<xsl:apply-templates select="$row/@*[local-name(.)=current( )/@attr]"
mode="csv:map-value"/>
<xsl:if test="position( ) != last( )">
<xsl:value-of select="$delimiter"/>
</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="@*" mode="map-value">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
type my.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:csv="http://www.ora.com/XSLTCookbook/namespaces/csv">
<xsl:import href="generic-attr-to-csv.xslt"/>
<!--Defines the mapping from attributes to columns -->
<xsl:variable name="columns" select="document('')/*/csv:column"/>
<csv:column name="Name" attr="name"/>
<csv:column name="Age" attr="age"/>
<csv:column name="Gender" attr="sex"/>
<csv:column name="Smoker" attr="smoker"/>
<!-- Handle custom attribute mappings -->
<xsl:template match="@sex" mode="csv:map-value">
<xsl:choose>
<xsl:when test=".='m'">male</xsl:when>
<xsl:when test=".='f'">female</xsl:when>
<xsl:otherwise>error</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
using the apache xalan parser
D:\Test>java org.apache.xalan.xslt.Process -in my.xml -xsl my.xsl -out my.csv
[Fatal Error] generic-attr-to-csv.xslt:15:6: The value of attribute "select" associated with an element type "xsl:v
alue-of" must not contain the '<' character.
file:///D:/Test/generic-attr-to-csv.xslt; Line #15; Column #6; org.xml.sax.SAXParseException: The value of attribut
e "select" associated with an element type "xsl:value-of" must not contain the '<' character.
java.lang.NullPointerException
at org.apache.xalan.transformer.TransformerImpl.createSerializationHandler(TransformerImpl.java:1171)
at org.apache.xalan.transformer.TransformerImpl.createSerializationHandler(TransformerImpl.java:1060)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1268)
at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1251)
at org.apache.xalan.xslt.Process.main(Process.java:1048)
Exception in thread "main" java.lang.RuntimeException
at org.apache.xalan.xslt.Process.doExit(Process.java:1155)
at org.apache.xalan.xslt.Process.main(Process.java:1128)
任何想法我做错了什么
答案 0 :(得分:1)
第15行的错误很明显:
<xsl:value-of select="$delimiter/>
有一个起始"
字符,但没有结尾"
个字符。这甚至不是一个格式良好的XML文档。
解决方案:用以下内容替换错误的行:
<xsl:value-of select="$delimiter"/>
注意,现在说明"
的结尾为"
。