XSLT:将属性从xml元素传递到另一个xml元素
我有源xml:XSLT:将属性从xml元素传递到另一个xml元素,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我有源xml: <?xml version="1.0" encoding="UTF-8"?> <message field1="11" field2="22"> <sub1 sub_field1="sub11" sub_field2="sub22" sub2_id="12243"/> <sub1 sub_field1="sub11" sub_field2="sub12" sub2_id="12244"/> <
<?xml version="1.0" encoding="UTF-8"?>
<message field1="11" field2="22">
<sub1 sub_field1="sub11" sub_field2="sub22" sub2_id="12243"/>
<sub1 sub_field1="sub11" sub_field2="sub12" sub2_id="12244"/>
<sub2 sub2_field="sub21" sub2_field2="sub22" id="12243"/>
<sub2 sub2_field="sub23" sub2_field2="sub24" id="12243"/>
<sub2 sub2_field="sub25" sub2_field2="sub26" id="12244"/>
<sub2 sub2_field="sub27" sub2_field2="sub28" id="12244"/>
</message>
这里是我需要的结构:
<message>
<sub1>
<sub_field1>value</sub_field1>
<sub_field2>value</sub_field2>
<sub2_list>
<sub2>
<sub2_field>value</sub2_field>
<sub2_field2>value</sub2_field2>
</sub2>
<sub2>
<sub2_field>value</sub2_field>
<sub2_field2>value</sub2_field2>
</sub2>
</sub2_list>
</sub1>
<sub1>
<sub_field1>value</sub_field1>
<sub_field2>value</sub_field2>
<sub2_list>
<sub2>
<sub2_field>value</sub2_field>
<sub2_field2>value</sub2_field2>
</sub2>
<sub2>
<sub2_field>value</sub2_field>
<sub2_field2>value</sub2_field2>
</sub2>
</sub2_list>
</sub1>
</message>
价值
价值
价值
价值
价值
价值
价值
价值
价值
价值
价值
价值
我不明白,如何将sub2_id从sub1标记传递到id sub2标记,如何使用sub2_id how参数
我的xsl如下所示:
<?xml version = '1.0' encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="message">
<xsl:variable name="sub2_id=" select="@sub2_id"/>
<xsl:element name="sub1">
<xsl:element name="sub_field1">
<xsl:value-of select="@sub_field1"/>
</xsl:element>
<xsl:element name="sub_field2>">
<xsl:value-of select="@sub_field2>"/>
</xsl:element>
</xsl:element>
<xsl:element name="sub2_list">
<xsl:for-each select="sub2[@id=$sub2_id]">
<xsl:element name="zpu">
<xsl:element name="sub2_field">
<xsl:value-of select="@sub2_field="/>
</xsl:element>
<xsl:element name="sub2_field2">
<xsl:value-of select="@sub2_field2"/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
sometextsometextsometextsometextsometextsometextsometext您的代码中确实存在一些语法错误,例如
sub2\u id=
不是有效的变量名
<xsl:variable name="sub2_id=" select="@sub2_id"/>
但是,在这里使用xsl:key
来查找sub2
元素可能是有益的
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="sub2" match="sub2" use="@id" />
<xsl:template match="message">
<xsl:copy>
<xsl:apply-templates select="sub1" />
</xsl:copy>
</xsl:template>
<xsl:template match="sub1">
<sub1>
<xsl:apply-templates select="@sub_field1|@sub_field2"/>
<sub2list>
<xsl:for-each select="key('sub2', @sub2_id)">
<sub2>
<xsl:apply-templates select="@sub2_field|@sub2_field2"/>
</sub2>
</xsl:for-each>
</sub2list>
</sub1>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
请注意,我添加了一个通用模板,用于将属性转换为元素,这大大简化了代码。您的代码中确实存在一些语法错误,例如
sub2\u id=
不是有效的变量名
<xsl:variable name="sub2_id=" select="@sub2_id"/>
但是,在这里使用xsl:key
来查找sub2
元素可能是有益的
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="sub2" match="sub2" use="@id" />
<xsl:template match="message">
<xsl:copy>
<xsl:apply-templates select="sub1" />
</xsl:copy>
</xsl:template>
<xsl:template match="sub1">
<sub1>
<xsl:apply-templates select="@sub_field1|@sub_field2"/>
<sub2list>
<xsl:for-each select="key('sub2', @sub2_id)">
<sub2>
<xsl:apply-templates select="@sub2_field|@sub2_field2"/>
</sub2>
</xsl:for-each>
</sub2list>
</sub1>
</xsl:template>
<xsl:template match="@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
请注意,我添加了一个通用模板,用于将属性转换为元素,这大大简化了代码。谢谢,这是帮助信息,我稍后将使用你的更好的模板。谢谢,这是帮助信息,我稍后将使用你的更好的模板。