[英]XSLT transform using TXMLDocument
我試圖將TXMLDocument用於XSLT轉換,並且發現了無法解釋的行為(對我而言)-TXMLDocument.transformNode不處理“ /”模式(與根節點https://msdn.microsoft.com/zh-cn/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進行轉換,因為不能通過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轉換的正確解決方案是什么?
正如Martin所說, match="/"
匹配樹中的頂部節點(DOM和XPath 2.0將其稱為文檔節點,XPath 1.0將其稱為根節點)。 但是,您已經通過在樹中提供了最外層的元素(DOM將其稱為文檔元素)來開始了轉換。 要匹配最外面的元素,您需要使用模式match="/*"
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.