3

問題は、同じ要素名を異なる状況で区別したいことです。例えば:

<element>Hello StackOverFlow</element>
<element>
  <group>
     <ge>hello g1</ge>
     <ge>hello g2</ge>
  </group>
  <group>
     <ge>hello g3</ge>
     <ge>hello g4</ge>
  </group>
</element>

テキスト付きの要素を変換したい

<div class="text_element">Hello StackOverFlow</div>

子ノードを持つ要素の場合:

<div class="element">
  <ul class="group">
     <li>hello g1</li>
     <li>hello g2</li>
  </ul>
  <ul class="group">
     <li>hello g3</li>
     <li>hello g4</li>
  </ul>
</div>

では、問題は、テンプレートを作成する際にこれら 2 種類の要素をどのように区別できるかということです。

4

3 に答える 3

7

1 つの簡単な方法: で 1 つのテンプレートを作成しmatch="element[normalize-space(text())]"、 で 1 つのテンプレートを作成しmatch="element[*]ます。最初のelement要素は、単なる空白ではないテキストノードの子を持つ要素に一致します。element2 番目は、要素の子を持つ要素に一致します。

于 2012-09-11T16:03:08.750 に答える
2

子孫要素のカウントを使用して、子があるかどうかを確認できます。count(descendant::group)=0

XSLT (入力にルート ノードxmlがあると仮定):

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

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

    <!-- No children -->
    <xsl:template match="element[count(descendant::group)=0]">
        <div class="text_element">
            <xsl:value-of select="text()"/>
        </div>
    </xsl:template>

    <!-- With children -->
    <xsl:template match="element[count(descendant::group)&gt;0]">
        <div class="element">
            <xsl:apply-templates select="group"/>
        </div>
    </xsl:template>

    <xsl:template match="group">
        <ul class="group">
            <xsl:apply-templates select="ge"/>
        </ul>
    </xsl:template>

    <xsl:template match="ge">
        <li>
            <xsl:value-of select="text()"/>
        </li>
    </xsl:template>

</xsl:stylesheet>

出力を与える

<div class="text_element">Hello StackOverFlow</div>
<div class="element">
  <ul class="group">
    <li>hello g1</li>
    <li>hello g2</li>
  </ul>
  <ul class="group">
    <li>hello g3</li>
    <li>hello g4</li>
  </ul>
</div>
于 2012-09-11T16:22:13.070 に答える
1

この短くて単純な変換:

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

 <xsl:template match="element[not(*)]">
   <div class="text_element"><xsl:apply-templates/></div>
 </xsl:template>

 <xsl:template match="element">
  <div class="element">
    <xsl:apply-templates/>
  </div>
 </xsl:template>

 <xsl:template match="group">
    <ul class="group">
      <xsl:apply-templates/>
    </ul>
 </xsl:template>

 <xsl:template match="ge">
  <li><xsl:apply-templates/></li>
 </xsl:template>
</xsl:stylesheet>

次の XML ドキュメントに適用した場合(提供された XML フラグメントは単一のトップ要素にラップされ、整形式の XML ドキュメントになります):

<t>
    <element>Hello StackOverFlow</element>
    <element>
        <group>
            <ge>hello g1</ge>
            <ge>hello g2</ge>
        </group>
        <group>
            <ge>hello g3</ge>
            <ge>hello g4</ge>
        </group>
    </element>
</t>

必要な正しい結果が生成されます

<div class="text_element">Hello StackOverFlow</div>
<div class="element">
   <ul class="group">
      <li>hello g1</li>
      <li>hello g2</li>
   </ul>
   <ul class="group">
      <li>hello g3</li>
      <li>hello g4</li>
   </ul>
</div>
于 2012-09-12T04:24:45.863 に答える