XSLT 转换与同一级别下的重复节点
XSLT transform with repeating node under same level
我是 xslt 新手。我正在学习 xslt 并且在转换 xml 格式时遇到困难。
我有以下 xml 输入
```<Body>
<Grp Name="Root">
<Grp Name="Info">
<Parm Name="parent_id" Val="Id_1" />
<Grp Name="CurrenInfo">
<Parm Name="current_id" Val="Id_1A" />
<Grp Name="CurrentChildInfo">
<Parm Name="Name" Val="State1" />
<Parm Name="Value" Val="S1" />
</Grp>
<Grp Name="CurrentChildInfo">
<Parm Name="Name" Val="State2" />
<Parm Name="Value" Val="S2" />
</Grp>
</Grp>
<Grp Name="CurrenInfo">
<Parm Name="current_id" Val="Id_1B" />
<Grp Name="CurrentChildInfo">
<Parm Name="Name" Val="State3" />
<Parm Name="Value" Val="S3" />
</Grp>
</Grp>
</Grp>
</Grp>
</Body>`
我需要将其转换为以下格式.....
```<Info>
<parent_id>Id_1</parent_id>
<original_list>
<list>
<current_id>Id_1A</current_id>
<Name>State1</Name>
<Value>S1</Value>
</list>
<list>
<current_id>Id_1A</current_id>
<Name>State2</Name>
<Value>S2</Value>
</list>
<list>
<current_id>Id_1B</current_id>
<Name>State3</Name>
<Value>S3</Value>
</list>
</original_list>
<Info>```
以下是我当前的 xslt
```<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Body">
<xsl:element name="Info">
<xsl:for-each select="//Grp[@Name='Root']/Grp[@Name='Info']">
<xsl:for-each select="Parm">
<xsl:element name="parent_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="//Grp[@Name='CurrenInfo']">
<xsl:element name="list">
<xsl:for-each select="Parm">
<xsl:element name="current_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Grp[@Name='CurrentChildInfo']">
<xsl:for-each select="Parm">
<xsl:element name="{@Name}">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>```
但是当我使用上面的 xslt 时,输出格式如下
```<Info>
<parent_id>Id_1</parent_id>
<list>
<current_id>Id_1A</current_id>
<Name>State1</Name>
<Value>S1</Value>
<Name>State2</Name>
<Value>S2</Value>
</list>
<list>
<current_id>Id_1B</current_id>
<Name>State3</Name>
<Value>S3</Value>
</list>
</Info>```
需要帮助将 xslt 更正为 return 所需的格式
谢谢
只做一些小的修改,您可以使用以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Body">
<xsl:element name="Info">
<xsl:for-each select="Grp[@Name='Root']/Grp[@Name='Info']">
<xsl:for-each select="Parm">
<xsl:element name="parent_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<original_list>
<xsl:for-each select=".//Grp[@Name='CurrentChildInfo']">
<xsl:element name="list">
<xsl:for-each select="../Parm">
<xsl:element name="current_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Parm">
<xsl:element name="{@Name}">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</original_list>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
它的输出是
<Info>
<parent_id>Id_1</parent_id>
<original_list>
<list>
<current_id>Id_1A</current_id>
<Name>State1</Name>
<Value>S1</Value>
</list>
<list>
<current_id>Id_1A</current_id>
<Name>State2</Name>
<Value>S2</Value>
</list>
<list>
<current_id>Id_1B</current_id>
<Name>State3</Name>
<Value>S3</Value>
</list>
</original_list>
</Info>
我从第一个 xsl:for-each
中删除了 //
,因为它似乎没有必要。但是如果你喜欢 select 所有 @Name='Root'
children,最好使用 .//
.
我是 xslt 新手。我正在学习 xslt 并且在转换 xml 格式时遇到困难。 我有以下 xml 输入
```<Body>
<Grp Name="Root">
<Grp Name="Info">
<Parm Name="parent_id" Val="Id_1" />
<Grp Name="CurrenInfo">
<Parm Name="current_id" Val="Id_1A" />
<Grp Name="CurrentChildInfo">
<Parm Name="Name" Val="State1" />
<Parm Name="Value" Val="S1" />
</Grp>
<Grp Name="CurrentChildInfo">
<Parm Name="Name" Val="State2" />
<Parm Name="Value" Val="S2" />
</Grp>
</Grp>
<Grp Name="CurrenInfo">
<Parm Name="current_id" Val="Id_1B" />
<Grp Name="CurrentChildInfo">
<Parm Name="Name" Val="State3" />
<Parm Name="Value" Val="S3" />
</Grp>
</Grp>
</Grp>
</Grp>
</Body>`
我需要将其转换为以下格式.....
```<Info>
<parent_id>Id_1</parent_id>
<original_list>
<list>
<current_id>Id_1A</current_id>
<Name>State1</Name>
<Value>S1</Value>
</list>
<list>
<current_id>Id_1A</current_id>
<Name>State2</Name>
<Value>S2</Value>
</list>
<list>
<current_id>Id_1B</current_id>
<Name>State3</Name>
<Value>S3</Value>
</list>
</original_list>
<Info>```
以下是我当前的 xslt
```<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Body">
<xsl:element name="Info">
<xsl:for-each select="//Grp[@Name='Root']/Grp[@Name='Info']">
<xsl:for-each select="Parm">
<xsl:element name="parent_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="//Grp[@Name='CurrenInfo']">
<xsl:element name="list">
<xsl:for-each select="Parm">
<xsl:element name="current_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Grp[@Name='CurrentChildInfo']">
<xsl:for-each select="Parm">
<xsl:element name="{@Name}">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>```
但是当我使用上面的 xslt 时,输出格式如下
```<Info>
<parent_id>Id_1</parent_id>
<list>
<current_id>Id_1A</current_id>
<Name>State1</Name>
<Value>S1</Value>
<Name>State2</Name>
<Value>S2</Value>
</list>
<list>
<current_id>Id_1B</current_id>
<Name>State3</Name>
<Value>S3</Value>
</list>
</Info>```
需要帮助将 xslt 更正为 return 所需的格式 谢谢
只做一些小的修改,您可以使用以下样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="Body">
<xsl:element name="Info">
<xsl:for-each select="Grp[@Name='Root']/Grp[@Name='Info']">
<xsl:for-each select="Parm">
<xsl:element name="parent_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<original_list>
<xsl:for-each select=".//Grp[@Name='CurrentChildInfo']">
<xsl:element name="list">
<xsl:for-each select="../Parm">
<xsl:element name="current_id">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
<xsl:for-each select="Parm">
<xsl:element name="{@Name}">
<xsl:value-of select="@Val"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</original_list>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
它的输出是
<Info>
<parent_id>Id_1</parent_id>
<original_list>
<list>
<current_id>Id_1A</current_id>
<Name>State1</Name>
<Value>S1</Value>
</list>
<list>
<current_id>Id_1A</current_id>
<Name>State2</Name>
<Value>S2</Value>
</list>
<list>
<current_id>Id_1B</current_id>
<Name>State3</Name>
<Value>S3</Value>
</list>
</original_list>
</Info>
我从第一个 xsl:for-each
中删除了 //
,因为它似乎没有必要。但是如果你喜欢 select 所有 @Name='Root'
children,最好使用 .//
.