XSL使用XML匹配多个变量

时间:2014-05-27 07:03:58

标签: variables xslt

我试图匹配xsl变量,即key1,key2与xml节点字符串。 问题:xsl变量可以像key1,key2,key3,key4一样变化,直到key.length ... 问题:如何在使用key [i]时修改我的xsl,那么ti将显示所有xml节点匹配。

这是我的XML:

    <?xml version="1.0" encoding="UTF-8"?>
<document>
<metadata>
  <field>marketing business</field>
  <field>PageTitle1 One</field>
  <field>marketing business link</field>
  <field>planning development</field>
  <field>PageTitle2 Two</field>
  <field>planning development link</field>
  <field>learning development</field>
  <field>PageTitle3 Threee</field>
  <field>learning development link</field>
</metadata>
</document>

这是我的XSL:

    <?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


<xsl:template match="/">

<xsl:variable name="key1">marketing</xsl:variable>
<xsl:variable name="key2">business</xsl:variable>

    <xsl:for-each select="document/metadata/field">

<xsl:choose>
    <xsl:when test="contains(.,$key1) and contains(.,$key2)">
      match <xsl:value-of select="." /><br/>
    </xsl:when>
    <xsl:when test="contains(.,$key2)">
      match <xsl:value-of select="." /><br/>
    </xsl:when>
    <!--... add other options here-->
    <xsl:otherwise></xsl:otherwise>
  </xsl:choose>

    </xsl:for-each>

</xsl:template>

结果:

match marketing business
match marketing business link

有任何帮助吗?或者有没有办法把它放在类似数组的变量或任何不同的方法中?...

1 个答案:

答案 0 :(得分:1)

考虑使用&#34;键&#34;在单独的XML文档中,将其命名为&#34; keys.xml&#34;

<keys>
    <key>marketing</key>
    <key>business</key>
</keys>

然后,您可以在XSLT中创建单个变量以引用此文档

<xsl:variable name="keys" select="document('keys.xml')/keys" />

使用此变量,您可以检查您的字段元素是否匹配所有键,如下所示:

  <xsl:variable name="matches" select="count($keys/key[contains(current(), .)])" />
  <xsl:choose>
    <xsl:when test="$matches = count($keys/key)">

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:variable name="keys" select="document('keys.xml')/keys" />
  <xsl:variable name="totalkeys" select="count($keys/key)" />

  <xsl:template match="/">
    <xsl:for-each select="document/metadata/field">
      <xsl:variable name="matches" select="count($keys/key[contains(current(), .)])" />
      <xsl:choose>
        <xsl:when test="$matches = $totalkeys">
          matches all <xsl:value-of select="." /><br/>
        </xsl:when>
        <xsl:when test="$matches = 1">
          matches one <xsl:value-of select="." /><br/>
        </xsl:when>
        <xsl:when test="$matches > 0">
          matches some <xsl:value-of select="." /><br/>
        </xsl:when>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>