有人可以帮我解决这个问题吗?
输入XML:
<dataXML>
<Items>
<itemLine>
<lineNo>1</lineNo>
<lineRefNo>001</lineRefNo>
<lineDes>test1</lineDes>
</itemLine>
<itemLine>
<lineNo>2</lineNo>
<lineRefNo>001</lineRefNo>
<lineDes>test2</lineDes>
</itemLine>
<itemLine>
<lineNo>3</lineNo>
<lineRefNo>002</lineRefNo>
<lineDes>test3</lineDes>
</itemLine>
<itemLine>
<lineNo>4</lineNo>
<lineRefNo>002</lineRefNo>
<lineDes>test4</lineDes>
</itemLine>
<itemLine>
<lineNo>5</lineNo>
<lineRefNo>002</lineRefNo>
<lineDes>test5</lineDes>
</itemLine>
<itemLine>
<lineNo>6</lineNo>
<lineRefNo>003</lineRefNo>
<lineDes>test6</lineDes>
</itemLine>
</Items>
我已根据LineRefNo重新分组项目行
转换xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="totalLine" select="count(dataXML/Items/itemLine)" />
<Root>
<xsl:value-of select="concat('<','test','>')" disable-output-escaping="yes"/>
<xsl:for-each select="dataXML/Items/itemLine">
<xsl:choose>
<xsl:when test="lineRefNo != preceding-sibling::itemLine[1]/lineRefNo">
<xsl:value-of select="concat('</','test','>')" disable-output-escaping="yes"/>
<xsl:value-of select="concat('<','test','>')" disable-output-escaping="yes"/>
<item>
<xsl:value-of select="concat('Line No : ',position())" />,<xsl:value-of select="lineRefNo" />
</item>
<xsl:if test="$totalLine = position()">
<xsl:value-of select="concat('</','test','>')" disable-output-escaping="yes"/>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<item>
<xsl:value-of select="concat('Line No : ',position())" />,<xsl:value-of select="lineRefNo" />
</item>
<xsl:if test="$totalLine = position()">
<xsl:value-of select="concat('</','test','>')" disable-output-escaping="yes"/>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
注意:请退出'&gt;'和'&lt;'在xslt转换中使用Test和Item标签
它会将输入xml转换为结果
**Result :**
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<test>
<item>Line No : 1,001</item>
<item>Line No : 2,001</item>
</test>
<test>
<item>Line No : 3,002</item>
<item>Line No : 4,002</item>
<item>Line No : 5,002</item>
</test>
<test>
<item>Line No : 6,003</item>
</test>
</Root>
**Expected Result:**
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<test>
<item>Line No : 1,001</item>
<item>Line No : 2,001</item>
</test>
<test>
<item>Line No : 1,002</item>
<item>Line No : 2,002</item>
<item>Line No : 3,002</item>
</test>
<test>
<item>Line No : 1,003</item>
</test>
</Root>
提前感谢
答案 0 :(得分:0)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kItemsByRef" match="itemLine"
use="lineRefNo"/>
<xsl:template match=
"itemLine
[generate-id()
=
generate-id(key('kItemsByRef', lineRefNo)[1])
]
">
<test>
<xsl:for-each select="key('kItemsByRef', lineRefNo)">
<item>Line No : <xsl:value-of select=
"concat(position(), ',', lineRefNo)"/>
</item>
</xsl:for-each>
</test>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
应用于提供的XML文档:
<dataXML>
<Items>
<itemLine>
<lineNo>1</lineNo>
<lineRefNo>001</lineRefNo>
<lineDes>test1</lineDes>
</itemLine>
<itemLine>
<lineNo>2</lineNo>
<lineRefNo>001</lineRefNo>
<lineDes>test2</lineDes>
</itemLine>
<itemLine>
<lineNo>3</lineNo>
<lineRefNo>002</lineRefNo>
<lineDes>test3</lineDes>
</itemLine>
<itemLine>
<lineNo>4</lineNo>
<lineRefNo>002</lineRefNo>
<lineDes>test4</lineDes>
</itemLine>
<itemLine>
<lineNo>5</lineNo>
<lineRefNo>002</lineRefNo>
<lineDes>test5</lineDes>
</itemLine>
<itemLine>
<lineNo>6</lineNo>
<lineRefNo>003</lineRefNo>
<lineDes>test6</lineDes>
</itemLine>
</Items>
</dataXML>
生成想要的正确结果:
<test>
<item>Line No : 1,001</item>
<item>Line No : 2,001</item>
</test>
<test>
<item>Line No : 1,002</item>
<item>Line No : 2,002</item>
<item>Line No : 3,002</item>
</test>
<test>
<item>Line No : 1,003</item>
</test>