使用xslt(MatLab)基于节点值过滤文件夹中的XML

时间:2014-08-10 07:09:32

标签: xml matlab xslt

我有一个包含数千个xml条目的文件夹(这将每天更新),我想要做的是根据特定的节点值过滤所有这些条目。 e.g。

Filename1.xml

<?xml version="1.0" encoding="utf-8"?>
<addresses>
   <address>
      <type>A</type> 
      <name>Joe</name>
      <street>Baker street 5</street>
   </address>
</addresses>

Filename2.xml

<?xml version="1.0" encoding="utf-8"?>
<addresses>
   <address>
      <type>B</type> 
      <name>Mary</name>
      <street>Baker street 5</street>
   </address>
</addresses>

是否可以使用XSLT过滤并仅接收包含以下内容的文件夹:

<type>A</type>

如果我使用MatLab xlst函数执行此操作

 XmlStr = xslt (filename,  xslstyle, '-tostring');

如果

,我希望输出应该是一个字符串

type == A else empty string。

我做了什么

xlsstyle.xsl - 更新

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>  
  <xsl:template match="@* | node()">
    <xsl:if test="//type[(node()='A')]">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>         
</xsl:stylesheet>

但是这会返回filename1.xml(正确)

<?xml version="1.0" encoding="utf-8"?>
<addresses>

  <address>

    <type>A</type> 

     <name>Joe</name>

    <street>Baker street 5</street>

 </address>

</addresses>

和filename2.xml。

 <?xml version="1.0" encoding="utf-8"?>

我做错了什么?

2 个答案:

答案 0 :(得分:1)

所以我将展示我是如何做到的,这有助于未来的其他“狐狸”(谁想通过MatLab来做 - 因为确实有很多方法)。

使用上面的xsl文件

 function FilterXML(xslstyle)
 % Author: amigo
 % Date:   10/08/2014
 % Description: Filter xml files based on node value using XSLT
 %
 %INPUTS
 %
 % xslstyle     string of the xslstyle file e.g 'xslstyle.xsl'
 %
 %% Import some java classes that we need
 import org.xml.sax.InputSource
 import javax.xml.parsers.*
 import java.io.*

 %% Make list of all *xml files in our dir
 filename=dir('*.xml');

 %% Make folder where we will write the output
 if ~exist('output','dir')
   mkdir output
 end

% this is just the pattern that i want to avoid
x = '<?xml version="1.0" encoding="utf-8"?>';

%% Main
 for i=1:length(filename)
   XmlStr = xslt (filename(i).name,  xslstyle, '-tostring');
   if strcmp(XmlStr,x)
      continue
   else
      iS = InputSource();
      iS.setCharacterStream(StringReader(XmlStr));
      XmlObj = xmlread(iS);
      out = ['output',filesep,filename(i).name];
      xmlwrite(out,XmlObj);
  end
end
end

任何其他想法都会受到欢迎!

答案 1 :(得分:0)

手头没有matlab,我使用了cli工具&#34; xsltproc&#34; (基于来自http://www.xmlsoft.org的libexml&amp; libxslt)来重现转换。

xsltproc -load-trace -noout -v -debug xslstyle.xsl Filename*.xml > xsldebug.log 2>&1

样式表按预期进行处理,当离开&#34; -noout&#34;时,将正确跳过Filename2.xml。未设置。似乎MatLab.xslt()函数为每个输入文件创建一个输出文件。也许有一个参数/配置开关来改变这种行为。