XSLT 1.0 将一个元素的内容传递给另一个
XSLT 1.0 Pass the contents of one element to another
我需要使用 XSLT 按原样处理 XML 文件,但连接一个元素的重复元素的值并将连接的字符串传递给另一个元素。
我遇到的困难是将串联保存为参数并能够在移动目标中访问该值。
例如。
原文XML
<root>
<someData>transform as is</someData>
<target>
<concatenatedElement/>
</target>
<someMoreData>transform as is</someMoreData>
<source>
<separateElement>valueX</separateElement>
<separateElement>valueY</separateElement>
<separateElement>valueZ</separateElement>
</source>
</root>
需要转换 XML:
<root>
<someData>transform as is</someData>
<target>
<concatenatedElement>valueXvalueYvalueZ</concatenatedElement>
</target>
<someMoreData>transform as is</someMoreData>
</root>
原来的XML比上面的例子大很多,所以我已经在应用模板将XML的其余部分按原样进行转换。我已经尝试了几种方法,包括从“匹配”模板中调用另一个模板,但是我无法访问源块中的值以发送到目标块。以下是我最近的尝试:
<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:param name="separateValues">
<xsl:for-each select="/root/source/separateElement">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:param>
<xsl:template match="/root/target">
<xsl:param name="separateValues"/>
<xsl:element name="target">
<xsl:value-of select="$separateValues"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/target/concatenatedElement">
<xsl:copy>
<xsl:for-each select="/root/source/*">
<xsl:value-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/source" />
</xsl:stylesheet>
给予
<root>
<someData>transform as is</someData>
<target>
<concatenatedElement>valueXvalueYvalueZ</concatenatedElement>
</target>
<someMoreData>transform as is</someMoreData>
</root>
我需要使用 XSLT 按原样处理 XML 文件,但连接一个元素的重复元素的值并将连接的字符串传递给另一个元素。
我遇到的困难是将串联保存为参数并能够在移动目标中访问该值。
例如。 原文XML
<root>
<someData>transform as is</someData>
<target>
<concatenatedElement/>
</target>
<someMoreData>transform as is</someMoreData>
<source>
<separateElement>valueX</separateElement>
<separateElement>valueY</separateElement>
<separateElement>valueZ</separateElement>
</source>
</root>
需要转换 XML:
<root>
<someData>transform as is</someData>
<target>
<concatenatedElement>valueXvalueYvalueZ</concatenatedElement>
</target>
<someMoreData>transform as is</someMoreData>
</root>
原来的XML比上面的例子大很多,所以我已经在应用模板将XML的其余部分按原样进行转换。我已经尝试了几种方法,包括从“匹配”模板中调用另一个模板,但是我无法访问源块中的值以发送到目标块。以下是我最近的尝试:
<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:param name="separateValues">
<xsl:for-each select="/root/source/separateElement">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:param>
<xsl:template match="/root/target">
<xsl:param name="separateValues"/>
<xsl:element name="target">
<xsl:value-of select="$separateValues"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/target/concatenatedElement">
<xsl:copy>
<xsl:for-each select="/root/source/*">
<xsl:value-of select="." />
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/source" />
</xsl:stylesheet>
给予
<root>
<someData>transform as is</someData>
<target>
<concatenatedElement>valueXvalueYvalueZ</concatenatedElement>
</target>
<someMoreData>transform as is</someMoreData>
</root>