XSLT:将属性从xml元素传递给另一个xml元素如何使用param

时间:2017-10-03 11:30:29

标签: 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"/>      
    <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

1 个答案:

答案 0 :(得分:0)

您的代码中确实存在一些语法错误,例如sub2_id=不是有效的变量名称

<xsl:variable name="sub2_id=" select="@sub2_id"/>

可能你打算这样做......

<xsl:variable name="sub2_id" select="@sub2_id"/>

也许你错过了一些代码,但是当你定义那个变量时,你就被定位在一个message元素上,当你真的应该在sub1元素上时,你会期望有代码中的xsl:for-eachxsl:apply-templates选择sub1

假设您被定位在sub1元素上,那么在这种情况下sub2sub1的兄弟,所以要选择它,你会这样做......

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

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