动态元素的XML转换



假设以下XML输入。

<Report Name="Report2" >
 <ITable i_id="Item ID" i_name="Item Name" heart_beat="Heart Beat" is_active="Is Active">
      <FkItemID_Collection>
           <FkItemID i_id="1">
                <i_name i_name="80">
                     <heart_beat heart_beat="0">
                          <is_active is_active="True">
                               <Tags>
                                    <Tag Name="ItemClass" Value="Division"/>
                                    <Tag Name="ItemDisplayName" Value="80"/>
                                    <Tag Name="ItemName" Value="80"/>
                                    <Tag Name="ItemType" Value="Logical"/> 
                               </Tags>
                          </is_active>
                     </heart_beat>
                </i_name>
           </FkItemID>
           <FkItemID i_id="2">
            //Same formatted day as above element
           </FkItemID>
      </FkItemID_Collection>
 </ITable>
</Report>

关于XML的专业是,可能有很多元素,例如例如:

<i_name i_name="80">
           <i_price i_price ="10">
                 <heart_beat heart_beat="0">`

同样。

可以动态更改此类元素的数量。标签总是进入<Tags>块。

作为最终结果,我期望这样的输出

<Report Name="Report2">
 <Table i_id="Item ID" i_name="item Name" heart_beat="heart_beat" col1="ItemClass" col2="ItemDisplayName" col3="ItemName" col4="ItemType" >
  <Details agent_id="1" agent_name="80" col1="Division" col2="80" col3="80" col4="Logical" />
  <Details i_id="2" i_name="BC" col1="Division" col2="BC" col3="BC" col4="Logical"   />
 </Table>
</Report>

我为该方案写了XSLT。但是我有一些我无法解决的问题。这就是我现在开发的。我一直坚持不知道我必须如何进入内部元素的部分,直到找到标签块,以及如何动态生成的标签(例如我上面提到的item_price)。

这就是我现在所做的。

<xsl:template match="/*/*[local-name()='ITable']">
    <xsl:element name="Table">
        <xsl:for-each select="./*">
            <xsl:for-each select="./*">
                <xsl:if test="position()=1">
                    <xsl:attribute name="i_id">Item ID</xsl:attribute>
                    <xsl:attribute name="i_name">Item Name</xsl:attribute>
                    <xsl:attribute name="i_beat">heart_beat</xsl:attribute>
                    <xsl:for-each select="./*/*/*/*">
                        <xsl:attribute name="{concat('col', position())}">
                            <xsl:value-of select="@TagName"/>
                        </xsl:attribute>
                    </xsl:for-each>
                </xsl:if>
            </xsl:for-each>
            <xsl:for-each select="./*">
                <xsl:element name="Details">
                    <xsl:attribute name="i_id">
                        <xsl:value-of select="@i_id"/>
                    </xsl:attribute>
                    <xsl:for-each select="./*">
                        <xsl:attribute name="i_name">
                            <xsl:value-of select="@i_name"/>
                        </xsl:attribute>
                        <xsl:for-each select="./*/*/*">
                            <xsl:attribute name="{concat('col', position())}">
                                <xsl:value-of select="@TagValue"/>
                            </xsl:attribute>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:element>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:element>
</xsl:template>

对于此问题的最佳解决方案是什么。

标签总是进入一个块。... 我坚持 在我不知道我必须如何进入内部元素之前,直到我找到深度 标签块

这是后代轴的目的:descendant::Tags//Tags将为您"找到"标签块,无论其深度有多深。

相关内容

  • 没有找到相关文章

最新更新