我有一个包含数千个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"?>
我做错了什么?
答案 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()函数为每个输入文件创建一个输出文件。也许有一个参数/配置开关来改变这种行为。