簡體   English   中英

使用TXMLDocument的XSLT轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM