我尝试使用TXMLDocument进行XSLT转换,发现(对我来说)无法解释的行为-- TXMLDocument.transformNode不处理'/‘模式(与根节点https://msdn.microsoft.com/en-us/library/ms256113(v=vs.85).aspx匹配)。
XML:
<notelist>
<note>NoteText</note>
</notelist>Xslt:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="/">
<TransformedNoteList>
<xsl:apply-templates/>
</TransformedNoteList>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>使用TXMLDocument Delphi代码:
var
XML: IXMLDocument;
XSL: IXMLDocument;
Output: XmlDomString;
begin
ResultMemo.Clear;
XML := LoadXMLData(XMLMemo.Text);
XSL := LoadXMLData(XsltMemo.Text);
XML.DocumentElement.TransformNode(XSL.DocumentElement, Output);
ResultMemo.Text := Output;我预计会有这样的结果:
<?xml version="1.0"?>
<TransformedNoteList></TransformedNoteList>但得到的xml文件为空。
我试图通过使用IXslProcessor来重现这种行为,并且一切正常。谁能给我解释一下什么是使用TXMLDocument进行转换,因为as在不通过IXslProccessor工作时被理解为?
使用IXSLProcessor:
var
XMLDoc, XSLStylesheet: IXMLDOMDocument;
XSLProcessor: IXSLProcessor;
XSLTemplate: IXSLTemplate;
begin
ResultMemo.Clear;
XMLDoc := CoDOMDocument60.Create;
XMLDoc.LoadXML(XMLMemo.Text);
XSLStylesheet := CoDOMDocument60.Create;
XSLStylesheet.LoadXML(XsltMemo.Text);
XSLTemplate := CoXSLTemplate60.Create;
XSLTemplate._Set_stylesheet(XSLStylesheet);
XSLProcessor := XSLTemplate.createprocessor;
XSLProcessor.Input := XMLDoc;
if XSLProcessor.Transform then
ResultMemo.Text := XSLProcessor.Output;
end;XSLT转换的正确解决方案是什么?
发布于 2018-01-23 23:05:43
正如Martin所说,match="/"匹配树中的顶部节点(DOM和XPath 2.0将其称为文档节点,XPath 1.0将其称为根节点)。但是您已经通过提供树中最外层的元素(DOM将其称为文档元素)开始了转换。要匹配最外层的元素,需要使用模式match="/*"。
https://stackoverflow.com/questions/48401406
复制相似问题