我有一个XML文件,我需要在其中复制每个
XML文件具有以下结构:
<Message>
<Id>VARIABLE_1</Id>
<Code>VAR</Code>
<Source>TEXT 1</Source>
<Source>TEXT 2</Source>
<Source/>
<Source>TEXT 3</Source>
<Comment/>
<Target>SOMETHING 1</Target>
<Target>SOMETHING 2</Target>
<Target/>
<Target>SOMETHING 3</Target>
<Comment/>
</Message>
我需要将其“转换”为:
<Message>
<Id>VARIABLE_1</Id>
<Code>VAR</Code>
<Source>TEXT 1</Source>
<Source>TEXT 2</Source>
<Source/>
<Source>TEXT 3</Source>
<Comment/>
<Target>TEXT 1</Target>
<Target>TEXT 2</Target>
<Target/>
<Target>TEXT 3</Target>
<Comment/>
</Message>
因此,基本上每个
总是会有数量相匹配的
我已经尝试过XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//Target">
<xsl:copy>
<xsl:value-of select="//Target/preceding-sibling::Source"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
但是它仅复制第一个
答案 0 :(得分:1)
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Target">
<xsl:variable name="i" select="count(preceding-sibling::Target) + 1" />
<xsl:copy>
<xsl:value-of select="../Source[$i]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或者,如果您愿意:
<xsl:template match="Target">
<xsl:copy>
<xsl:value-of select="../Source[count(current()/preceding-sibling::Target) + 1]"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
一种简单的方法如下:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Solution -->
<xsl:template match="Target">
<xsl:copy>
<xsl:value-of select="../Source[substring-after(current(),' ') = substring-after(.,' ')]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出符合预期。