xsl交叉引用比较一个节点与另一个节点

时间:2013-08-29 14:05:20

标签: xml xslt xpath

我有一个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>

1 个答案:

答案 0 :(得分: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> )与 any 右边的节点(当前人的country元素)。