2012-01-17 3 views
3

Я полный новичок в xslt. Я пытаюсь придумать трансформации, что делает незначительные изменения в исходный XML-документ, например, из:Несколько незначительных изменений в исходном 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="..."> он совпадает с исходным (например, п ot по новому тексту - можете ли вы сказать мне, каким должен быть следующий шаг?

ответ

5

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

<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().

+0

это превосходно, спасибо. Можно ли подавить '' в том случае, если не существует '[[...]]'? –

+0

@JackDouglas: Добро пожаловать. Да, возможно, подавление «ph» - я скоро верну свой ответ. –

+0

@JackDouglas: Я обновил свой ответ. –

Смежные вопросы