1

这可能已经在某个地方得到了回答,但我没有正确的词来搜索它:

假设我有包含城市列表的数据文件:

 <cities>
    <city abbr='A'>NameA</city>
    <city abbr='b'>NameB</city>
  </cities>

城市列表很长,我想根据缩写过滤城市

[过滤数据]

   <skip>
     <abbr>A</abbr>
     <abbr>B</abbr>
   </skip>

我如何使用此过滤器数据(以 xml 形式)从原始数据文件中跳过一些节点,特别是如何在 for-each 循环中使用,例如

 <xsl:template match="/">    
      <xsl:for-each select="not in skip list">
         ???
      </xsl:for-each>     
  </xsl:template>

我想在 XSLT 文件内部以 xml 格式使用过滤器数据,因为列表可能会太长。在 xslt 中包含文件的选项是什么?目前我正在使用这样的SAXON sth。

java -jar /usr/local/liquibase/saxon/saxon9he.jar ./base/cities.xml ./templates/split_cities.xslt authorName=sakhunzai

这个例子是对原始数据的过度简化

4

1 回答 1

4

您用 saxon 标签标记了您的问题,所以我假设您使用的是 xslt 2.0。

您可以使一个变量保持值被跳过

<xsl:variable name="skip">
    <abbr>A</abbr>
    <abbr>C</abbr>
</xsl:variable>

然后你可以针对这个变量测试节点的属性

<xsl:apply-templates select="cities/city[not(@abbr = $skip/abbr)]" />

所以对于输入

<?xml version="1.0" encoding="UTF-8"?>
 <cities>
    <city abbr='A'>NameA1</city>
    <city abbr='B'>NameB1</city>
    <city abbr='C'>NameC1</city>
    <city abbr='A'>NameA2</city>
    <city abbr='B'>NameB2</city>
    <city abbr='C'>NameC2</city>
  </cities>

关注 xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:variable name="skip">
        <abbr>A</abbr>
        <abbr>C</abbr>
    </xsl:variable>

    <xsl:template match="/">
        <cities>
            <xsl:apply-templates select="cities/city[not(@abbr = $skip/abbr)]" />
        </cities>
    </xsl:template>

    <xsl:template match="city">
        <xsl:copy-of select="." />
    </xsl:template>
</xsl:stylesheet>

产生输出

<?xml version="1.0" encoding="UTF-8"?>
<cities xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <city abbr="B">NameB1</city>
    <city abbr="B">NameB2</city>
</cities>

编辑:

将过滤器存储在外部文件中是有意义的。让skip.xml 是这样的具有结构的文件

<?xml version="1.0" encoding="UTF-8"?>
<skip>
    <abbr>A</abbr>
    <abbr>C</abbr>
</skip>

然后您可以通过以下方式更改变量声明

<xsl:variable name="skip" select="document('path/to/skip.xml')/skip/abbr" />

其他事情可能保持不变。

于 2013-08-16T08:20:06.333 回答