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>

那么,问题是如何在编写模板时区分这两种元素呢?

4

3 回答 3

7

一种简单的方法:用 . 编写一个模板,match="element[normalize-space(text())]"match="element[*]. 第一个匹配element带有文本节点子节点的元素,而不仅仅是空格;第二个将element元素与子元素匹配。

于 2012-09-11T16:03:08.750 回答
2

您可以使用计算后代元素来查看它是否有子元素,例如count(descendant::group)=0

xmlXSLT(假设您的输入上有一个根节点):

<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 回答