XSLT1.0循环自引用数据

时间:2016-12-19 00:54:50

标签: xml xslt

我在xsl中有一个静态的国家/地区列表,我希望能够使用预先选择的值进行调用。要做到这一点,需要迭代每个节点并进行简单检查(优选同时保持国家自包含在同一文件中)。但是,执行< xsl:copy-of>有效,但是< xsl:for-each>在同一个表达式上没有 - 发生了什么?这可能吗?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:isoCountry="isoCountry:country">
  <isoCountry:country>
      <option value=""></option>
      <option value="AU">Australia</option>
      <option value="AD">Andorra</option>
      <option value="AE">United Arab Emirates</option>
      <option value="AF">Afghanistan</option>
      <option value="AG">Antigua and Barbuda</option>
  </isoCountry:country>

  <xsl:template name="CountrySelect">
    <select>

      <option> <!-- correct number of nodes, good -->
        <xsl:value-of select="count(document('')/*/isoCountry:menu/menu/*)"/>
      </option> 

      <xsl:copy-of select="document('')/*/isoCountry:country/option"/> <!-- this works -->

      <xsl:for-each select="document('')/*/isoCountry:country/option"> <!-- this does not -->
        <option><xsl:value-of select="."/></option>
      </xsl:for-each>

    </select>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

以下是一个示例,当CountrySelect属性匹配时,使用param调用selected模板生成value属性。

<xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:isoCountry="isoCountry:country"
        exclude-result-prefixes="isoCountry">

    <xsl:output method="html"/>

    <isoCountry:country>
        <option value=""/>
        <option value="AU">Australia</option>
        <option value="AD">Andorra</option>
        <option value="AE">United Arab Emirates</option>
        <option value="AF">Afghanistan</option>
        <option value="AG">Antigua and Barbuda</option>
    </isoCountry:country>

    <xsl:template match="/">
        <form>
            <xsl:call-template name="CountrySelect">
                <xsl:with-param name="selected">AU</xsl:with-param>
            </xsl:call-template>
        </form>
    </xsl:template>

    <xsl:template name="CountrySelect">
        <xsl:param name="selected"/>
        <select>
            <xsl:for-each select="document('')/*/isoCountry:country/option">
                <xsl:element name="{name()}"> <!-- could just be name="option" -->
                    <xsl:if test="$selected=@value">
                        <xsl:attribute name="selected">true</xsl:attribute>
                    </xsl:if>
                    <xsl:copy-of select="@*"/>
                    <xsl:copy-of select="text()"/>
                </xsl:element>
            </xsl:for-each>
        </select>
    </xsl:template>
</xsl:stylesheet>