Преобразование курсивных XML-тегов в WordML-теги

Мне просто нужно преобразовать XML-документ в документ WordML (если его можно назвать простым!) С помощью этой формы (без инструкций по обработке):

<body>
    <p>
        <r>This is the <italic>standard</italic> text run.</r> 
    </p>
</body>

Преобразованный XML должен выглядеть так, согласно документу WordML:

<w:body>
    <w:p>
        <w:r>
            <w:t>This is the </w:t> 
        </w:r>
    </w:p>
    <w:p>
        <w:pPr>
            <w:i/>
        </w:pPr>
        <w:r>
            <w:t>standard</w:t> 
        </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t> text run.</w:t> 
        </w:r>
    </w:p>
</w:body>

Как мне создать преобразование XSLT для правильной обработки курсивных тегов ?? ..


person Brethlosze    schedule 18.09.2012    source источник


Ответы (2)


Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:w="some:w" exclude-result-prefixes="w">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

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

 <xsl:template match="p/r/italic/text()">
    <w:p>
        <w:pPr>
            <w:i/>
        </w:pPr>
        <w:r>
            <w:t><xsl:value-of select="."/></w:t>
        </w:r>
    </w:p>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к предоставленному XML-документу:

<body>
    <p>
        <r>This is the <italic>standard</italic> text run.</r>
    </p>
</body>

дает желаемый правильный результат:

<w:body xmlns:w="some:w">
   <w:p>
      <w:r>
         <w:t>This is the </w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:pPr>
         <w:i/>
      </w:pPr>
      <w:r>
         <w:t>standard</w:t>
      </w:r>
   </w:p>
   <w:p>
      <w:r>
         <w:t> text run.</w:t>
      </w:r>
   </w:p>
</w:body>
person Dimitre Novatchev    schedule 18.09.2012
comment
Для меня ТАКОЕ большая честь, Димитр, за ваш ответ ... Я могу сказать, что выучил XSL из-за ваших ответов здесь, на StackOverflow.com !!. Тем не менее, я все еще полностью сбит с толку трансформацией личности. В этом примере предложения p / r / хорошо обрабатывают форматирование, но я не могу понять, как справиться с немного сложным использованием тегов. Кстати, я назначил ответ Мэдсу, потому что он пришел сюда на несколько секунд раньше :). - person Brethlosze; 18.09.2012
comment
@hypfco, пожалуйста. По более сложным ситуациям - задавайте новые вопросы :) - person Dimitre Novatchev; 18.09.2012
comment
@hypfco, а шаблон удостоверения для текущей проблемы особо не нужен. - person Dimitre Novatchev; 18.09.2012

Для ввода столь же простого, как в приведенном примере, подойдет следующая таблица стилей. Использование модифицированного преобразования идентичности со специализированными шаблонами для <italics> и r/text().

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
        xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">
    <xsl:output indent="yes"/>

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

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

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

    <xsl:template match="r/italic">
        <w:p>
            <w:pPr>
                <w:i/>
            </w:pPr>
            <w:r>
                <w:t><xsl:value-of select="."/></w:t> 
            </w:r>
        </w:p>
    </xsl:template>  

</xsl:stylesheet>
person Mads Hansen    schedule 18.09.2012
comment
Спасибо за быстрый ответ. Спасибо также за ссылку на википедию. Я изучил ваш код, чтобы применить его в моем случае. Я также проверю эти преобразования идентичности ........... - person Brethlosze; 18.09.2012