2014-07-10 71 views
0

我想打开/关闭的标签来变换处理的指令,像这样:转换_font处理指令CSS与XSL

<para><?Pub _font Weight="bold"?>Date Re-inspected<?Pub /_font?></para> 

<div class="x-para-9-5"><span style="font-weight: bold">Date Re-inspected</span></div> 

我试图执行Processing instructions transform但是第二副本的第一个PI的直接兄弟文本节点没有被删除(作为新手,我不明白为什么这段代码会删除它):

我不想要的结果T:

<div class="x-para-9-5"><span style="font-weight:bold;">Date Re-inspected</span>Date Re-inspected</div> 

这是我的代码,从上面提到的其它问题稍微修改:

<xsl:template match="processing-instruction('Pub')"> 
<xsl:choose> 
    <xsl:when test="starts-with(., '_font')"> 
     <xsl:choose> 
      <xsl:when test="contains(.,'bold')"> 
       <span style="font-weight:bold;"> 
       <xsl:apply-templates select="following-sibling::node()[1][self::text()]"/> 
       </span> 
     </xsl:when> 
    </xsl:choose> 
    </xsl:when> 
    <xsl:when test="starts-with(., '/_font') 
     | text()[preceding-sibling::node()[1][self::processing-instruction('_font')]]"> 
    </xsl:when> 
<xsl:otherwise/> 
</xsl:choose> 
</xsl:template> 

理解任何建议,这是我的第一周XSL。

+0

此外,我不知道什么字符“|”手段。我认为这意味着“或”。 – Caroline

回答

0

这不是您应该在第一周使用XSLT进行的操作。简而言之,这里的主要问题是这两个处理指令是单独的节点 - 它们之间的文本也是如此。

要达到您的预期效果,您必须:
(1)将“开放”PI变成一个跨度;
(2)将“包含”文本节点放置在span元素中; (3)抑制相同的文本节点不被默认模板复制; (4)压制“收盘”PI。

请注意,术语“打开PI”,“包含文本”和“关闭PI”是一种虚构; XSLT将它们视为三个兄弟节点。

尝试下面的样式表:

XSLT 1.0

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

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="para"> 
    <div> 
     <xsl:apply-templates select="@*|node()"/> 
    </div> 
</xsl:template> 

<xsl:template match="processing-instruction('Pub')[starts-with(., '_font Weight')]"> 
    <span style="font-weight: {substring-before(substring-after(., '&quot;'), '&quot;')}"> 
     <xsl:copy-of select="following-sibling::text()[1]"/> 
    </span> 
</xsl:template> 

<!-- suppress text between PIs --> 
<xsl:template match="text()[count(preceding-sibling::processing-instruction()) = count(following-sibling::processing-instruction())]"/> 

<!-- suppress "closing" PIs --> 
<xsl:template match="processing-instruction('Pub')[starts-with(., '/')]"/> 

</xsl:stylesheet> 

当上述被施加到以下测试输入

<para>Opening plain text <?Pub _font Weight="bold"?>bold part<?Pub /_font?> closing plain text.</para> 

结果将是:

<?xml version="1.0" encoding="UTF-8"?> 
<div>Opening plain text <span style="font-weight: bold">bold part</span> closing plain text.</div> 
+0

谢谢您的回答我的问题。我无法让它正常工作,因为样式表中已经定义了冲突的模板。我将继续努力。 “”@ * | node()“'是指匹配属性还是节点? – Caroline

+0

“*”@ * | node()“是否表示匹配属性或节点?*”是的。 - “*样式表中已经定义了冲突模板。*”使用优先级或模式(或两者)来微调您的匹配。 –

+0

再次感谢你,我会阅读模式和优先事项。 – Caroline

0

这个问题有点不清楚。如果PI总是只标记元素(意味着您没有混合内容,并且它们只包围元素中的所有文本),则可以执行以下操作:

不确定从哪里获取“div”也许你应该展示更多的XML。但是,更简单的答案是仅触发PI“start”上的输出并使用xsl:attribute引发属性。

鉴于此输入:

<para><?Pub _font Weight="bold"?>Date Re-inspected<?Pub /_font?></para> 

这XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     version="1.0"> 
    <xsl:template match="para"> 
     <span> 
      <xsl:apply-templates/> 
     </span> 
    </xsl:template> 
    <xsl:template match="processing-instruction('Pub')"> 
     <xsl:choose> 
     <xsl:when test="starts-with(., '_font')"> 
      <xsl:choose> 
       <xsl:when test="contains(.,'bold')"> 
        <xsl:attribute name="style"> 
         <xsl:text>font-weight:bold;</xsl:text> 
        </xsl:attribute> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
    </xsl:stylesheet> 

你得到这样的:

<span style="font-weight:bold;">Date Re-inspected</span> 

而且可以扩展这种在元素来处理多个督察以及对这些内容(如“粗体”或“斜体”)做出决定。

给出的另一个答案是处理不是父元素的直接子元素的内联PI的更好的解决方案(即它们可以在任何内联中)。这就是为什么你应该显示更多所需的输入XML。

+0

谢谢你的回答我的问题。我能够应用粗体,但对于父分区,所以这很有帮助。在样式表中定义了已经冲突的段模板,所以我无法准确地实现您的代码。我会尝试测试具有不同优先级的模板,不确定这是否是好的形式。 – Caroline