使用match和starts-with过滤XML文件

时间:2014-05-26 09:17:18

标签: xml xslt match startswith

我有一个XML文件,可容纳大约1000个用户,并具有以下结构:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="filter.xsl"?>
  <USERS>
    <USER>
      <ID>15492</ID>
      <USERNAME>0047</USERNAME>
      <ADDRESS>
        <FIRSTNAME>mr</FIRSTNAME>
        <LASTNAME>Dees</LASTNAME>
        <ORGANIZATION>WON Organization Name </ORGANIZATION>
        <EMAIL>email@address.com</EMAIL>
      </ADDRESS>
      <COMMERCEINFO>
        <PAYMENTMETHOD>MANUAL</PAYMENTMETHOD>
      </COMMERCEINFO>
      <ACCOUNT>
        <PASSWORD>72d7df914cc8806b2eb0fa0203f322d7</PASSWORD>
        <EXPIRES>1601-01-01</EXPIRES>
      </ACCOUNT>
       .
       .
       .
    </USER>
    <USER>
    ...
    </USER>
  </USERS>

我只需要查看<ORGANIZATION>元素以'WON'开头的用户。使用IE8打开XML文件,连接的XSL文件如下所示:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="USER[ADDRESS[ORGANIZATION[starts-with(.,'WON')]]]" />  
</xsl:stylesheet>

但是,使用这个我在IE8页面源中看到的结果给所有用户,过滤器似乎不起作用。

1 个答案:

答案 0 :(得分:1)

我对XSLT进行了一些小调整:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" />
    <xsl:template match="/">
        <users>
            <xsl:apply-templates select="USERS/USER[ADDRESS[ORGANIZATION[starts-with(.,'WON')]]]"/>
        </users>
    </xsl:template>
    <xsl:template match="USER">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

这导致只有<user>个节点的ORGANIZATION以&#39; WON&#39;开头。

但是,这不会更新源本身。您现在设置它的方式是浏览器使用提供的XSLT解析XML。
如果您想要转换源,您必须使用PHP,Java,ASP.Net等服务器端语言。这些语言可以为您进行XML / XSLT转换,并输出生成的HTML作为网页来源。