1

我开始使用 xml 和 xslt,我还阅读了一些教程等。根据我对这个 xml 的理解:

<?xml version="1.0"?>  
<Menu>  
    <Accounts type="menu" label="Accounts">  
        <ListUsers type="cmd" label="List users">  
            <cmd>HAha</cmd>  
        </ListUsers>  
        <AddUsers type="cmd" label="Add users">  
            <cmd></cmd>  
        </AddUsers>  
        <DeleteUsers type="cmd" label="Delete users">  
            <cmd></cmd>  
        </DeleteUsers>  
    </Accounts>  
    <Hardware type="menu" label="Hardware">  
        <ListDisks type="cmd" label="List disks">  
            <cmd></cmd>  
        </ListDisks>  
    </Hardware>  
    <Network type="menu" label="Network"></Network>  
    <Filesystem type="menu" label="Filesystem"></Filesystem>  
</Menu>

这个xslt:

<?xml version="1.0"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
<xsl:template match="/*">   
    <xsl:apply-templates select="*"/>  
</xsl:template>  
<xsl:template match="*">  
    <div><xsl:value-of select="@label"/></div>  
</xsl:template>   
</xsl:stylesheet>

应该输出所有元素的标签,但它没有......我错过了什么,请你纠正并解释一下,谢谢。

4

2 回答 2

4

好吧,您应该向我们展示您想要的输出,但是如果您想处理所有元素,那么请确保您继续处理所有元素,或者通过更改来展平层次结构

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

<xsl:template match="/*">
<xsl:apply-templates select=".//*"/>
</xsl:template>

或通过更改使用递归

<xsl:template match="*">
<div><xsl:value-of select="@label"/></div>
</xsl:template>

类似于

<xsl:template match="*">
<div>
  <xsl:value-of select="@label"/>
  <xsl:apply-templates select="*"/>
</div>
</xsl:template>
于 2012-06-01T11:37:51.990 回答
1

这段代码有两个问题

<xsl:template match="*">       
  <div>
    <xsl:value-of select="@label"/>
  </div>   
</xsl:template>
  1. 不是顶部元素(或顶部元素本身)的子元素的元素根本不会被处理。为了纠正这个问题,应该在模板正文中添加一条新指令——例如:<xsl:apply-templates select="*"/>

  2. 没有label属性的元素将生成一个空的<div>. 如果使用适当的模板匹配模式,则可以避免这种情况,以便仅为具有此属性的元素选择模板。

这是一个完整的解决方案,它可以简短而简单

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="*[@label]">
     <div><xsl:value-of select="@label"/></div>
   <xsl:apply-templates select="*"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<Menu>
    <Accounts type="menu" label="Accounts">
        <ListUsers type="cmd" label="List users">
            <cmd>HAha</cmd>
        </ListUsers>
        <AddUsers type="cmd" label="Add users">
            <cmd></cmd>
        </AddUsers>
        <DeleteUsers type="cmd" label="Delete users">
            <cmd></cmd>
        </DeleteUsers>
    </Accounts>
    <Hardware type="menu" label="Hardware">
        <ListDisks type="cmd" label="List disks">
            <cmd></cmd>
        </ListDisks>
    </Hardware>
    <Network type="menu" label="Network"></Network>
    <Filesystem type="menu" label="Filesystem"></Filesystem>
</Menu>

产生了想要的正确结果:

<div>Accounts</div>
<div>List users</div>
<div>Add users</div>
<div>Delete users</div>
<div>Hardware</div>
<div>List disks</div>
<div>Network</div>
<div>Filesystem</div>
于 2012-06-01T11:49:39.750 回答