Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SAXON for Java将存储在字符串中的XML片段解析为XSLT中的节点_Xml_Xslt_Saxon - Fatal编程技术网

使用SAXON for Java将存储在字符串中的XML片段解析为XSLT中的节点

使用SAXON for Java将存储在字符串中的XML片段解析为XSLT中的节点,xml,xslt,saxon,Xml,Xslt,Saxon,在XSLT中,我有一个包含字符串的变量。此字符串包含一段XML。这是通过编程实现的,但与此等效: <xsl:variable name="xmlfrag" select="'<foo>this <bar>is</bar> it</foo>'"/> 有没有办法解析此XML并将其添加到输出中?我们正在使用SAXON for Java。使用扩展功能Dimitre解决方案需要SAXON的许可版本 下面是另一个同样适用于免费版本的Saxon

在XSLT中,我有一个包含字符串的变量。此字符串包含一段XML。这是通过编程实现的,但与此等效:

<xsl:variable name="xmlfrag" select="'<foo>this <bar>is</bar> it</foo>'"/>


有没有办法解析此XML并将其添加到输出中?我们正在使用SAXON for Java。

使用扩展功能

Dimitre解决方案需要SAXON的许可版本

下面是另一个同样适用于免费版本的Saxon的解决方案

我已经在萨克森HE 9.5.X上成功地尝试过了

相反的过程是

主要内容如下:

import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.lib.ExtensionFunctionCall;
import net.sf.saxon.lib.ExtensionFunctionDefinition;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.om.StructuredQName;
import net.sf.saxon.s9api.DocumentBuilder;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.SequenceType;

import javax.xml.transform.stream.StreamSource;

import java.io.StringReader;

@SuppressWarnings("serial")
public class XmlParser extends ExtensionFunctionDefinition {
    @Override
    public StructuredQName getFunctionQName() {
        return new StructuredQName("vis", URI, "my.custom.uri");
    }

    @Override
    public SequenceType[] getArgumentTypes() {
        return new SequenceType[] { SequenceType.SINGLE_STRING };
    }

    @Override
    public SequenceType getResultType(SequenceType[] sequenceTypes) {
        return SequenceType.NODE_SEQUENCE;
    }

    @Override
    public ExtensionFunctionCall makeCallExpression() {
        return new ExtensionFunctionCall() {
            DocumentBuilder constructor;

            @Override
            public Sequence call(XPathContext ctx, Sequence[] secs) throws XPathException {
                // Not synchronized, as worst case it initialize twice
                if (constructor == null)
                    constructor = new Processor(ctx.getConfiguration()).newDocumentBuilder();
                String xml = secs[0].head().getStringValue();
                try {
                    return constructor.build(new StreamSource(new StringReader(xml))).getUnderlyingNode();
                } catch (SaxonApiException e) {
                    final int max = 500;
                    String xml2 = xml.length() > 500 ? xml.substring(0, max)+"..." : xml;
                    throw new XPathException("Error when parsing XML.\n"+xml2, e);
                }
            }
        };
    }
}
您可以按如下方式使用此功能:

<xs:value-of xmlns:vis="my.custom.uri" select="vis:parse-xml('<a>Test</a>')"/>

问得好,+1。请参阅我的答案,以获得完整且简单的解决方案。:)