节点到节点的XSLT/XML复制值

节点到节点的XSLT/XML复制值,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我正在尝试将一个节点的节点内容复制到另一个节点。基本上,节点内容应该与第一个节点中的内容相同,只是第二个节点中的引号不应该被替换 我找到了一些代码并对其进行了修改,但它只复制了第一个节点内容的第一个外观 这是我到目前为止所掌握的xslt代码 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declarati

我正在尝试将一个节点的节点内容复制到另一个节点。基本上,节点内容应该与第一个节点中的内容相同,只是第二个节点中的引号不应该被替换

我找到了一些代码并对其进行了修改,但它只复制了第一个节点内容的第一个外观

这是我到目前为止所掌握的xslt代码

  <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:param name="pReplacement" select="/strings/string/de/text()"/>

    <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="$pReplacement"/>
    </xsl:template>
</xsl:stylesheet>

输入XML为:

 <?xml version="1.0"?>
 <?xml-stylesheet href="test.xsl" type="text/xsl"?>
  <strings>
    <string name="cpu">
        <en>example1</en>
        <de>something1</de>
        <es>""</es>
    </string>
    <string name="gpu">
        <en>example2</en>
        <de>something2</de>
        <es>""</es>
    </string>
    <string name="mainboard">
        <en>example3</en>
        <de>something3</de>
        <es>""</es>
    </string>
</strings>

例1
有些事
""
例2
什么
""
例3
有些事
""
错误的输出是:

<?xml-stylesheet href="test.xsl" type="text/xsl"?><strings>
  <string name="cpu">
    <en>example1</en>
    <de>something1</de>
    <es>something1</es>
  </string>
  <string name="gpu">
    <en>example2</en>
    <de>something2</de>
    <es>something1</es>
  </string>
  <string name="mainboard">
    <en>example3</en>
    <de>something3</de>
    <es>something1</es>
  </string>
</strings>

例1
有些事
有些事
例2
什么
有些事
例3
有些事
有些事
所需的输出应该如下所示

<?xml-stylesheet href="test.xsl" type="text/xsl"?><strings>
  <string name="cpu">
    <en>example1</en>
    <de>something1</de>
    <es>"something1"</es>
  </string>
  <string name="gpu">
    <en>example2</en>
    <de>something2</de>
    <es>"something2"</es>
  </string>
  <string name="mainboard">
    <en>example3</en>
    <de>something3</de>
    <es>"something3"</es>
  </string>
</strings>

例1
有些事
“一些事情1”
例2
什么
“一些东西2”
例3
有些事
“一些事情3”
也许有人能帮我找到一个解决方案,或者给我指出正确的方向


非常感谢您的方法不起作用,因为XPath表达式

/strings/string/de/text()
有几个结果,本例中有三个。如果将它们放入如下参数中:

<xsl:param name="pReplacement" select="/strings/string/de/text()"/>
然后,将仅为此操作选择第一个节点

您无需做太多更改,只需删除顶级参数,并将
strings/string/es/text()
的内容替换为

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

但这需要始终存在
de
元素作为
string
元素的子元素,并且它始终位于
es
元素之前。最后,如果在
es
元素之前有几个
de
元素,那么如果使用XSLT 2.0,这可能是一个问题,因为它只会将前面所有
de
元素的字符串值连接起来。

@Parfait我们不知道这是否有意义。人们在屏幕上显示的许多XML文档都是“真实”问题的精简版本。除了
strings/string/es
之外,可能还有
es
元素不受此模板的影响。这可能是个好主意,但我们不知道。非常感谢您快速、详细和专业的回答。你完全正确。它是xml的精简版本,但在本例中,“es”元素不在其他位置。同时也感谢在线xsl编辑器的提示,它让我的测试速度更快。
<xsl:value-of select="../../de"/>
<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>
<strings>
   <string name="cpu">
      <en>example1</en>
      <de>something1</de>
      <es>something1</es>
   </string>
   <string name="gpu">
      <en>example2</en>
      <de>something2</de>
      <es>something2</es>
   </string>
   <string name="mainboard">
      <en>example3</en>
      <de>something3</de>
      <es>something3</es>
   </string>
</strings>
<xsl:template match="es/text()">
  <xsl:value-of select="../preceding-sibling::de"/>
</xsl:template>