1

XMLとXSLTの学習を始めたばかりで、Xpathについて簡単な質問があります。

XMLコードは次のとおりです。

<root>

<shop>
    <person> 
        <employee> 
            <name> Alexis </name> 
            <role> Manager </role> 
            <task> Sales </task> 
        </employee> 
    </person>
</shop>

<person> 
    <employee> 
        <role> Supervisor </role> 
        <name> Blake </name> 
        <task> Control </task> 
    </employee> 
</person>


</root>

XSLTコードは次のとおりです。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="root"> 
<html><head></head> 
<body><xsl:apply-templates/> 
</body> 
</html> 
</xsl:template> 


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

<xsl:template match="employee"> 
<u> <xsl:apply-templates select="name"/> </u> 
(Task: <xsl:apply-templates select="task"/>) 
<br></br> 
</xsl:template> 

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

</xsl:stylesheet>

出力は次のとおりです。

Alexis (Task: Sales )
Blake (Task: Control )
Blake (Task: Control ) 

私が理解していないのは、なぜ最後の部分が複製されているのですか?XSLTコードのこの部分が原因であることを私は知っています:

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

しかし、それは私がコードをいじってFirefoxで表示していたからです。でも理由はわかりません。

私が理解していることから、それは「ルート」のすべての孫要素を次のように選択しています。

ルート/ショップ/人

しかし、なぜアレクシスも繰り返されないのですか?ブレイクだけが繰り返されます...

4

1 に答える 1

1

ルートマッチングテンプレートでは<xsl:apply-templates/>、最初のショップ人物の要素を選択します。person要素に関しては、このための特定のテンプレートがないため、XSLTは引き続き子要素を照合し、「Blake」の従業員をピックアップします。

ただし、ショップに一致するテンプレートがあり、問題は実際にそれに一致するテンプレートで何をするかにあります。

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

これを使用してxpath式を開始したため、現在配置されているshop/root要素ではなく、ドキュメントのルート要素を基準にしてマッシングが開始されます。これは、要素/ root / shop/person/root/ person / employeeを選択することを意味します。これにより、重複する「Blake」が作成されます。ただし、他の場所で「Alexis」の従業員要素と一致していないため、これは1回だけ出力されます。

従業員の要素を一致させるために、おそらく代わりにこれを行う必要があります

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

これは、現在の要素のすべての孫と一致します。*子要素と一致するため*/*、子要素の子要素と一致します。

ただし、従業員要素のみを出力することを目的としている場合は、要素のデフォルトのテンプレートマッチング動作がその子要素を処理するという事実を利用して、XSLTを単純化できます。このXSLTを試してください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes" />

   <xsl:template match="root">
      <html>
         <head/>
         <body>
            <xsl:apply-templates/>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="employee">
      <u>
         <xsl:value-of select="name"/>
      </u>
      <xsl:value-of select="concat(' (Task:', task, ')')"/>
      <br/>
   </xsl:template>
</xsl:stylesheet>

XMLに適用すると、次のように出力されます。

<html>
   <head>
   </head>
   <body>
      <u> Alexis </u> (Task: Sales )<br>
      <u> Blake </u> (Task: Control )<br>
   </body>
</html>
于 2012-06-07T06:30:38.570 に答える