来自以下XML
<Rows>
<Row RowNo="1" ProductNo="Product1" ProductText="Some Other Text" Type="A"/>
<Row RowNo="2" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="3" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="4" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="5" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="6" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="7" ProductNo="Product2" ProductText="Some Other Text" Type="A"/>
<Row RowNo="8" ProductNo="Product3" ProductText="Some Other Text" Type="A"/>
<Row RowNo="9" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="10" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="11" ProductNo="Product4" ProductText="Some Other Text" Type="A"/>
<Row RowNo="12" ProductNo="" ProductText="Some Text" Type="T"/>
<Row RowNo="13" ProductNo="" ProductText="Some Text" Type="T"/>
</Rows>
我想转换为以下内容:
<Line>
<ID>1</ID>
<Note>Some Text\nSome Text\nSome Text\nSome Text\nSome Text</Note>
<Description>Product 1</Description>
</Line>
<Line>
<ID>2</ID>
<Description>Product 2</Description>
</Line>
<Line>
<ID>3</ID>
<Note>Some Text\nSome Text</Note>
<Description>Product 3</Description>
</Line>
<Line>
<ID>4</ID>
<Note>Some Text\nSome Text</Note>
<Description>Product 4</Description>
</Line>
我已经完成了行的创建,这是我遇到问题的“注释”。对于每个Type ='T'行,我想使用ProductText属性的值并将它们与换行符连接。如果后面的兄弟是“ A线”,则不应创建“注释”节点。 我尝试使用
<xsl:template match="/Rows/Row[@Type!='T']">
<xsl:element name="Line">
<xsl:element name="ID">
<xsl:value-of select="@RowNo"/>
</xsl:element>
<xsl:element name="cbc:Note">
<xsl:value-of select="following-sibling::*[@Type='T']/@ProductText"/>
</xsl:element>
<xsl:element name="Description">
<xsl:value-of select="@ProductNo"/>
</xsl:element>
</xsl:element>
</xsl:template>
但是那(当然)是将所有“ T线”放入每行的Note节点中。
我正在使用XSLT 2.0
任何帮助将不胜感激
答案 0 :(得分:0)
在 XSLT 2.0 中,这是一个相对简单的分组问题:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/Rows">
<Lines>
<xsl:for-each-group select="Row" group-starting-with="Row[@Type='A']">
<Line>
<ID>
<xsl:value-of select="position()"/>
</ID>
<xsl:if test="current-group()[@Type='T']">
<Note>
<xsl:value-of select="current-group()[@Type='T']/@ProductText" separator="\n"/>
</Note>
</xsl:if>
<Description>
<xsl:value-of select="@ProductNo"/>
</Description>
</Line>
</xsl:for-each-group>
</Lines>
</xsl:template>
</xsl:stylesheet>
请注意添加的根元素Lines
。没有这个,结果将不会是格式正确的XML文档。
P.S。在XML中,\n
是无意义的字符串,而不是换行符。