【问题标题】:xsl want to transform the following xml to html:xsl 想要将以下 xml 转换为 html:
【发布时间】:2020-05-04 16:45:33
【问题描述】:
<!ELEMENT TITLE      (CDATA | ELEMENTX )+  > 

如果我使用下面的那么当 TITLE 包含 CDATA 和 ELEMENTX 包含 CDATA 我得到重复的文本。 这个元素TITLE的模板应该怎么写?

<xsl:template match="TITLE">
  <span>
    <p><xsl:value-of select="."/></p>
    <xsl:for-each select="*">
      <xsl:choose>
        <xsl:when test="local-name()='ELEMENT1'"> 
          <xsl:apply-templates select="."/>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each> 
   </span>
</xsl:template>

【问题讨论】:

  • 请允许我建议您提供迄今为止您尝试过的示例。一个最小的、完整的和可验证的例子将不胜感激。
  • 您可能需要阅读How to Ask,然后阅读edit 您的问题,以充分利用stackoverflow。
  • 基本上你在问题中看到的就是我尝试过的。当 TITLE 只有一个 CDATA 时,这是可行的,但是当 TITLE 没有 CDATA 但有一个子元素时,我将数据写入两次。有没有办法检测具有 CDATA 的元素?

标签: xslt


【解决方案1】:

根据我的理解,当 DTD 中允许混合类型的内容时,您似乎被卡住了,并且您正在处理 CDATA 出现时,如果有更多的子元素则面临问题。

如果您想将所有孩子推入p,那么您可以使用&lt;xsl:apply-templates/&gt; 并在模板中处理更多数据。

如果您只需要处理 CDATA 更​​新的代码,请使用

    <p>
        <xsl:if test="text()">
            <xsl:value-of select="text()"/>
        </xsl:if>
    </p>

而不是

<p><xsl:value-of select="."/></p>

【讨论】:

    【解决方案2】:

    以下似乎完全符合我的需要。 如果在任何子元素之前有的话,它会从父元素 TITLE 中取出 Text。然后它在一个子元素上工作(如果有),然后在下一个子元素之前将任何文本放在父元素中,依此类推。

    <xsl:template match="TITLE">
      <span>
      <xsl:for-each select="* | ./text()">
        <xsl:choose>
        <xsl:when test="local-name()=''">
          <xsl:value-of select="."/>
        </xsl:when>
        <xsl:when test="local-name()='ELEMENT1'"> 
          <xsl:apply-templates select="."/>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each> 
      </span>
    </xsl:template>  
    

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多