1

我有一个看起来像这样的 xml

<para>
   text text text
   <b>text</b> text text <i>text</i>
</para>

目标是将其转换为 mediaWiki 格式,使用 ''' 表示粗体等。

当我为此编写转换时,模板匹配会忽略<para>标签内的所有文本,只有<b>s 和<i>s 被转换。我需要帮助。

更新:这是我迄今为止尝试过的:

这是我到目前为止所尝试的。

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

<xsl:template match="b">
<xsl:text>'''</xsl:text><xsl:value-of select="replace(replace(.,'\s+$',''),'^\s+','')" disable-output-escaping="no"/><xsl:text>'''</xsl:text>
</xsl:template>

<xsl:template match="i">
<xsl:text>''</xsl:text><xsl:value-of select="replace(replace(.,'\s+$',''),'^\s+','')" disable-output-escaping="no"/><xsl:text>''</xsl:text>
</xsl:template>

这是我尝试 text() 函数时使用的。

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

--update-- 为了不丢失文本块前后的空格以及粗体和斜体标志,我们还可以检查文本前后的空格。

<xsl:template match="text()">
    <xsl:variable name="originalText" select="."/>
    <xsl:if test="starts-with($originalText,' ')">
        <xsl:text> </xsl:text>
    </xsl:if>
    <xsl:value-of select="normalize-space(.)" disable-output-escaping="no"/>
    <xsl:if test="ends-with($originalText,' ')">
        <xsl:text> </xsl:text>
    </xsl:if>
</xsl:template>
4

1 回答 1

0

当我为此编写转换时,模板匹配会忽略标签内的所有文本,只有<b>s 和<i>s 被转换。我需要帮助。

更新:这是我迄今为止尝试过的:

这是我到目前为止所尝试的。

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

您的问题正是在此模板中。您的代码忽略除元素之外的任何其他内容 - 子项。*缩写代表child::element()para因此根本不处理text-nodes 的子节点。

解决方案

只需删除上面的模板。然后将选择用于元素节点的内置 XSLT 模板来处理para元素。它所做的只是<xsl:apply-templates/>,这是<xsl:apply-templates select="child::node()"/>. 这将为每个子节点(任何类型,包括文本节点)应用模板。当文本节点的子节点para被处理时,文本节点的内置 XSLT 模板被选中——它所做的只是照原样复制文本。

转换现在变为

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

    <xsl:template match="b">
        <xsl:text>'''</xsl:text>
        <xsl:value-of select="replace(replace(.,'\s+$',''),'^\s+','')"/>
        <xsl:text>'''</xsl:text>
    </xsl:template>

    <xsl:template match="i">
        <xsl:text>''</xsl:text>
        <xsl:value-of select="replace(replace(.,'\s+$',''),'^\s+','')" />
        <xsl:text>''</xsl:text>
    </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<para>
   text text text
   <b>text</b> text text <i>text</i>
</para>

结果现在包括 的文本节点子节点 para

   text text text
   '''text''' text text ''text''
于 2010-08-19T16:22:29.860 回答