对源XML文档进行多次微小更改

时间:2012-01-17 19:13:38

标签: xml xslt

我是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 个答案:

答案 0 :(得分: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()