5

我用来处理XSLTXML文件的一般 java 代码是:

public static final String transformXmlDocument(String inputXmlString,
            File xsltFile) {

        TransformerFactory factory = TransformerFactory.newInstance();
        StreamSource xslt = new StreamSource(xsltFile);

        StreamSource text = new StreamSource(new StringReader(inputXmlString));
        StringWriter writer = new StringWriter();
        StreamResult textOP = new StreamResult(writer);

        try {
            Transformer transformer = factory.newTransformer(xslt);
            transformer.transform(text, textOP);
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerException e2) {
            e2.printStackTrace();
        }
        String results = writer.toString();

        return results;
}

我必须处理XSLT3.0 版本才能使用以下功能:

解析 xml 片段()

这个版本的XSLT说法会引发错误:

未找到 parse-xml-fragment() 作为函数

我的输入 XML :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data>
  <![CDATA[<pi>hi</pi>]]>
</data>

XSLT 代码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:data="http://example.com/data"
     xmlns:text="http://exselt.net/text"
     xmlns:err="http://www.w3.org/2005/xqt-errors"
     exclude-result-prefixes="xs xsl data text err"
     version="3.0">

<xsl:output indent="yes"/>

     <xsl:template match="/">
         <xsl:variable name="sample">
            <xsl:copy-of select="parse-xml-fragment('&lt;gi&gt;surface&lt;/gi&gt;&lt;gi&gt;surface&lt;/gi&gt;&lt;gi&gt;surface&lt;/gi&gt;')" />
         </xsl:variable>
         <final>
            <xsl:copy-of select="data/pi"/>
             <xsl:for-each select="$sample/gi">
                 <pi><xsl:value-of select="."/></pi>
            </xsl:for-each> 
         </final>
     </xsl:template>

</xsl:stylesheet>

预期输出:

<final>
    <pi>hi</pi>
    <pi>surface</pi>
    <pi>surface</pi>
    <pi>surface</pi>
  </final>

任何人都可以提供解决方案吗?

4

1 回答 1

4

您需要确保 Saxon 9.8 HE 或 PE 或 EE 在您的课程路径上,HE 可在SourceforgeMaven以及saxonica.com的商业版 PE 和 EE上获得。请参阅http://saxonica.com/html/documentation/about/installationjava/installingjava.htmlhttp://saxonica.com/html/documentation/using-xsl/embedding/jaxp-transformation.html推荐,一旦你已经安装了一个特定版本,直接使用例如http://saxonica.com/html/documentation/javadoc/net/sf/saxon/TransformerFactoryImpl.html而不是依赖 JAXP 类加载器机制,所以假设你有 Saxon 9.8 HE安装了可以更换

    TransformerFactory factory = TransformerFactory.newInstance();

    TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
于 2017-06-28T08:15:29.533 回答