我是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="...">
它与原始节点匹配(例如,不是新文本 - 你能告诉我下一步应该是什么吗?
答案 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()