XSLT:将属性从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:

<?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>

请注意,我添加了一个通用模板,用于将属性转换为元素,这大大简化了代码。

谢谢,这是帮助信息,我稍后将使用你的更好的模板。谢谢,这是帮助信息,我稍后将使用你的更好的模板。