我有源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"/>
<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如何使用param?.................. .........................
我的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>
sometextsometextsometextsometextsometextsometextsometextsometextsometext
答案 0 :(得分:0)
您的代码中确实存在一些语法错误,例如sub2_id=
不是有效的变量名称
<xsl:variable name="sub2_id=" select="@sub2_id"/>
可能你打算这样做......
<xsl:variable name="sub2_id" select="@sub2_id"/>
也许你错过了一些代码,但是当你定义那个变量时,你就被定位在一个message
元素上,当你真的应该在sub1
元素上时,你会期望有代码中的xsl:for-each
或xsl:apply-templates
选择sub1
。
假设您被定位在sub1
元素上,那么在这种情况下sub2
是sub1
的兄弟,所以要选择它,你会这样做......
<xsl:for-each select="../sub2[@id=$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>
请注意,我添加了一个用于将属性转换为元素的通用模板,这极大地简化了代码。