节点到节点的XSLT/XML复制值
我正在尝试将一个节点的节点内容复制到另一个节点。基本上,节点内容应该与第一个节点中的内容相同,只是第二个节点中的引号不应该被替换 我找到了一些代码并对其进行了修改,但它只复制了第一个节点内容的第一个外观 这是我到目前为止所掌握的xslt代码节点到节点的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
<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>