2

鉴于下面的 XSL 模板和 XML,这是我试图实现的 HTML 输出(或多或少):

<p>
foo goes here
  <span class="content"><p>blah blah blah</p><p>blah blah blah</p></span>
bar goes here
  <span class="content">blah blah blah blah blah blah</span> 
</p>

以下是实际呈现的内容(缺少 <span.content> 的全部内容):

<p>
foo goes here
  <span class="content"></span>
bar goes here
  <span class="content">blah blah blah blah blah blah</span> 
</p>

这是我的模板(片段):

 <xsl:template match="note[@type='editorial']">
   <span class="content">
     <xsl:apply-templates />
   </span>
 </xsl>
 <xsl:template match="p">
   <p>
     <xsl:apply-templates />
   </p>
 </xsl>

这是我的xml:

<p>
foo goes here
  <note type="editorial"><p>blah blah blah</p><p>blah blah blah</p></note>
bar goes here
  <note type="editorial">blah blah blah blah blah blah</note> 
</p>

渲染特定元素并不重要。IE。我不在乎是否渲染了 <p> 或 <div> 或 <span>,只要没有丢失任何文本元素。我想避免创建一个特定的规则来匹配“p/note/p”,假设 <note> 元素可以包含任意子元素。

我完全是 xsl 的菜鸟,所以任何额外的提示或指针都会非常有帮助。

提前致谢。

4

3 回答 3

1

好的,所以我只是大惊小怪,这是我最终想出的解决方案。

嵌套的 <p> 标签不起作用。您的浏览器不喜欢它们,XSLT 也不喜欢它们。所以,我把所有东西都换成了 <divs> 和 <spans>

另外,我在模板的末尾添加了几个包罗万象的模板。

这是对我的目的来说运行良好的最终版本:

<xsl:template match="note[@type='editorial']">
   <span class="content">
     <xsl:apply-templates />
   </span>
</xsl:template>

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

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

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

H T:

http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

以及xsl:apply-templates 如何仅匹配我定义的模板?

于 2012-11-29T23:54:21.913 回答
1

您应该使用apply-templates而不是apply-template

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="note[@type='editorial']">
        <span class="content">
            <xsl:apply-templates/>
        </span>
    </xsl:template>
    <xsl:template match="p">
        <p>
            <xsl:apply-templates />
        </p>
    </xsl:template>
 </xsl:stylesheet>
于 2012-11-29T23:35:26.043 回答
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <xsl:apply-templates select="p"/>
    </xsl:template>
    <xsl:template match="p">
    <p>
    <xsl:apply-templates/>
    </p>
    </xsl:template>
    <xsl:template match="span">
     <note type="editorial">
     <xsl:choose>
     <xsl:when test="child::*">
     <xsl:copy-of select="child::*"/>
     </xsl:when>
     <xsl:otherwise>
                <xsl:value-of select="."/>
    </xsl:otherwise>
    </xsl:choose>
    </note>
    </xsl:template>
    <xsl:template match="text()">
    <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
于 2012-11-30T10:33:59.530 回答