проблема с преобразованием XML - PullRequest
1 голос
/ 19 августа 2010

У меня есть 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>

1 Ответ

0 голосов
/ 19 августа 2010

когда я пишу преобразование для этого, совпадение шаблона игнорирует весь текст внутри тега, и только <b> s и <i> s конвертируются.мне нужна помощь.

обновление: вот что я пробовал до сих пор:

это то, что я пробовал до сих пор.

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

Ваша проблемаименно в этом шаблоне.Ваши коды игнорируют все остальное, кроме элемента - детей.аббревиатура * означает child::element().Таким образом, дочерние текстовые узлы para вообще не обрабатываются.

Решение :

Просто удалите приведенный выше шаблон.Затем для обработки элемента para будет выбран встроенный шаблон XSLT для узлов элементов.Все, что он делает, это <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''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...