将带有标记的注释内容复制到节点

时间:2016-01-08 14:02:50

标签: xml xslt xliff

我在互联网上搜索了一个解决方案,但没找到一个。我甚至不确定这是否可能或导致这种行为的原因。我正在尝试将节点内容复制到其他节点。它没有问题,但在第一个节点是标签(xliff:g),只复制标签文本元素。

我缺少什么,或者为什么这个标签没有被复制?

这是我的输入xml:

<?xml version="1.0"?>
<texts xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
 <?xml-stylesheet href="hello.xsl" type="text/xsl"?>
  <strings>
    <string name="cpu">
        <en>example1</en>
        <de name="cpu">"something <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> something1</de>
        <es>""</es>
    </string>
    <string name="gpu">
        <en>example2</en>
        <de name="gpu">something2<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g></de>
        <es>""</es>
    </string>
    <string name="mainboard">
        <en>example3</en>
        <de><xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g></de>
        <es>""</es>
    </string>
</strings>
</texts>

我的xsl转换xml:

<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="strings/string/es/text()">
     <xsl:value-of select="../../de"/>
    </xsl:template>

</xsl:stylesheet>

并且只复制xliff:g标记的文本值的输出:

<texts xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><?xml-stylesheet href="hello.xsl" type="text/xsl"?>
   <strings>
      <string name="cpu">
         <en>example1</en>
         <de name="cpu">"something <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> something1</de>
         <es>"something %1$s something1</es>
      </string>
      <string name="gpu">
         <en>example2</en>
         <de name="gpu">something2<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>
         </de>
         <es>something2%1$s</es>
      </string>
      <string name="mainboard">
         <en>example3</en>
         <de>
            <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>
         </de>
         <es>%1$s</es>
      </string>
   </strings>
</texts>

所需的输出如下所示:

<texts xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"><?xml-stylesheet href="hello.xsl" type="text/xsl"?>
   <strings>
      <string name="cpu">
         <en>example1</en>
         <de name="cpu">"something <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> something1</de>
         <es>"something <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g> something1</es>
      </string>
      <string name="gpu">
         <en>example2</en>
         <de name="gpu">something2<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>
         </de>
         <es>something2<xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g></es>
      </string>
      <string name="mainboard">
         <en>example3</en>
         <de>
            <xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g>
         </de>
         <es><xliff:g id="WIDGET_HOST_NAME">%1$s</xliff:g></es>
      </string>
   </strings>
</texts>

也许有人可以帮助我弄清楚我做错了什么,或者为什么转型会像这样。

非常感谢提前 卡利

2 个答案:

答案 0 :(得分:1)

<xsl:value-of select="../../de"/>创建一个文本节点,其中包含第一个选定节点的字符串值,如果要复制节点使用<xsl:copy-of select="../../de"/>,或者您可能希望<xsl:copy-of select="../../de/*"/>复制子元素({1}}元素。

答案 1 :(得分:1)

而不是:

<xsl:value-of select="../../de"/>

使用:

<xsl:copy-of select="../../de/node()"/>