Несколько мелких изменений в исходном XML-документе - PullRequest
3 голосов
/ 17 января 2012

Я полный новичок в xslt. Я пытаюсь придумать преобразование, которое вносит незначительные изменения в исходный XML-документ, например, из:

<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
  <file>
    <trans-unit>
      <source>Kodiak1 [[Name]]</source>
      <target></target>
    </trans-unit>
  </file>
</xliff>

до:

<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
  <file>
    <trans-unit>
      <source>Kodiak1 [[Name]]</source>
      <target>Kodiak1 <ph>Name</ph></target>
    </trans-unit>
  </file>
</xliff>

До сих пор я придумал:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="target">
    <target>
      <xsl:value-of select="preceding-sibling::source" /> 
    </target>
  </xsl:template>
</xsl:stylesheet>

Который копирует текст из узла <source> в узел <target>, но теперь я застрял - не в последнюю очередь потому, что если я добавлю еще один <xsl:template match="...">, он будет соответствовать оригиналу (например, не новому тексту - Можете ли вы сказать мне, каким должен быть следующий шаг?

1 Ответ

5 голосов
/ 17 января 2012

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

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

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

 <xsl:template match="trans-unit[contains(source, '[[')]/target">
  <xsl:variable name="vS" select="../source"/>

  <target>
   <xsl:value-of select="substring-before($vS, '[')"/>
   <ph>
     <xsl:value-of select=
      "translate(substring-after($vS, '[['), ']','')"/>
   </ph>
  </target>
 </xsl:template>

 <xsl:template match="target">
  <target>
   <xsl:value-of select="../source"/>
  </target>
 </xsl:template>
</xsl:stylesheet>

при применении к этому XML-документу (предоставленное немного более интересно):

<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
    <file>
        <trans-unit>
            <source>Kodiak1 [[Name]]</source>
            <target></target>
        </trans-unit>
        <trans-unit>
            <source>Kodiak2</source>
            <target></target>
        </trans-unit>
    </file>
</xliff>

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

<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
   <file>
      <trans-unit>
         <source>Kodiak1 [[Name]]</source>
         <target>Kodiak1 <ph>Name</ph>
         </target>
      </trans-unit>
      <trans-unit>
         <source>Kodiak2</source>
         <target>Kodiak2</target>
      </trans-unit>
   </file>
</xliff>

Объяснение :

Надлежащее использование шаблонов и стандартных функций XPath substring-before(), substring-after() и translate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...