2

我有一个 xml 片段,如下所示

<xml>
<person>
    <name>bob</name>
    <holidays>
        <visit>GB</visit>
        <visit>FR</visit>
    </holidays>
</person>
<person>
    <name>joe</name>
    <holidays>
        <visit>DE</visit>
        <visit>FR</visit>
    </holidays>
</person>


<countrylist>
    <country>GB</country>
    <country>FR</country>
    <country>DE</country>
    <country>US</country>
</countrylist>
</xml>

我想根据该人是否访问过该国家/地区,用是或否列出国家列表中的所有国家。因此,上述 xml 的输出,例如

Bob 
  GB Yes 
  FR Yes 
  DE No 
  US No

Joe 
  GB No 
  FR Yes 
  DE Yes 
  US No 

这是我到目前为止所尝试的:

<xsl:template match="xml">
    <xsl:apply-templates select="person">
    </xsl:apply-templates>
</xsl:template>


<xsl:template match="person">
<xsl:value-of select="name"></xsl:value-of>
    <xsl:apply-templates select="holidays"></xsl:apply-templates>
</xsl:template>

<xsl:template match="holidays">
            <xsl:variable name="v" select="holidays"></xsl:variable>
    <xsl:for-each select="/xml/countrylist/country">
        <xsl:variable name="vcountry" select="."></xsl:variable>
        <xsl:if test="$v/holidays[$vcountry]">      
        <xsl:value-of select="$vcountry"></xsl:value-of><xsl:value-of select="'*'"/>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

编辑:我终于使用以下方法进行了管理;有没有更简单的方法?

<xsl:template match="xml">
    <xsl:apply-templates select="person">
    </xsl:apply-templates>
</xsl:template>
<xsl:template match="person">
    <xsl:variable name="hols" select="holidays"/>
    <xsl:value-of select="name"/>
    <xsl:for-each select="/xml/countrylist/country">
        <xsl:variable name="vcountry" select="."/>
        <xsl:if test="$hols[visit=$vcountry]">
            <xsl:value-of select="$vcountry"/>
            <xsl:value-of select="'*'"/>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
4

1 回答 1

1

如果您只想显示每个人访问过的国家/地区(而不是对他们countrylist访问的国家/地区显示“否”),那么您根本不需要参与

<xsl:template match="person">
    <xsl:value-of select="name"/>
    <xsl:for-each select="holidays/visit">
        <xsl:value-of select="." />
        <xsl:text> *</xsl:text>
    </xsl:for-each>
</xsl:template>

如果您确实想要“否”条目,那么您的方法很好,但您可以稍微简化一下:

<xsl:template match="person">
    <xsl:variable name="visits" select="holidays/visit"/>
    <xsl:value-of select="name"/>
    <xsl:text> - </xsl:text>
    <xsl:for-each select="/xml/countrylist/country">
        <xsl:value-of select="." />
        <xsl:choose>
            <xsl:when test=". = $visits">
                <xsl:text>: Yes  </xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>: No  </xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

如果左侧节点(country在本例中为.visit

于 2013-08-29T15:06:41.733 回答