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

このコードには2つの問題があります

<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 に答える