我有 XML 输出表示正在输出的数据表,如下所示:
<results>
<Row1.Name>Henry</Row1.Name>
<Row1.Id>P162</Row1.Id>
<Row1.Age>23</Row1.Age>
<Row2.Name>John</Row2.Name>
<Row2.Id>P137</Row2.Id>
<Row2.Age>27</Row2.Age>
<Row3.Name>Mary</Row3.Name>
<Row3.Id>L493</Row3.Id>
<Row3.Age>32</Row3.Age>
</results>
我想把它转换成这个:
<results>
<Row>
<Name>Henry</Name>
<Id>P162<Id>
<Age>23</Age>
</Row>
<Row>
<Name>John</Name>
<Id>P137<Id>
<Age>27</Age>
</Row>
<Row>
<Name>Mary</Name>
<Id>L493<Id>
<Age>32</Age>
</Row>
</results>
我正在使用的应用程序迫使我使用 XSLT 1.0,我确信这真的很简单,但是我今天有一个心理障碍,所以我想我会问我的虚拟同事。
有人有什么想法吗?
注意:修改了所需的输出以不显示迭代行号,这是我想要的。
还没有任何接近工作的东西。仍然在玩不同的东西。
以为我可以写这样的东西:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="Row" select="distinct-values(*[contains(name(),'Row')])" />
<xsl:for-each select="$Row">
<xsl:variable name="rowName" select="name()" />
<Row>
<xsl:for-each select="*[contains(name(),$Row)]">
<xsl:copy select="." />
</xsl:for-each>
</Row>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
产生这个:
<results>
<Row>
<Row1.Name>Henry</Row1.Name>
<Row1.Id>P162</Row1.Id>
<Row1.Age>23</Row1.Age>
</Row>
<Row>
<Row2.Name>John</Row2.Name>
<Row2.Id>P137</Row2.Id>
<Row2.Age>27</Row2.Age>
</Row>
<Row>
<Row3.Name>Mary</Row3.Name>
<Row3.Id>L493</Row3.Id>
<Row3.Age>32</Row3.Age>
</Row>
</results>
然后返回并删除所有 Row# 前缀:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*[contains(name(),'.')]">
<xsl:variable name="Name" select="substring-after(name(),'.')" />
<xsl:element name="{$Name}">
<xsl:value-of select="." />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
两种转换都不起作用,我认为我不能distinct-values
与 XSLT 1.0 一起使用