我有一个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>
答案 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
元素)。