这是我使用XSLT完成了一些清理过程的XML。
<assets>
<asset>
<no>1</no>
<type>image</type>
<H>224 mm</H>
<W>154 mm</W>
</asset>
<asset>
<no>2</no>
<type>image</type>
<H>224 mm</H>
<W>154 mm</W>
</asset>
<asset>
<no>3</no>
<type>image</type>
<H>225 mm</H>
<W>155 mm</W>
</asset>
<asset>
<no>4</no>
<type>image</type>
<H>224 mm</H>
<W>154 mm</W>
</asset>
</assets>
现在,我必须做另一个转型过程。假设图像没有。 1是对的。我需要创建一个XSLT来检查所有图像以匹配图像1的大小。如果大小不同,它将在新节点下发布 - &gt;备注。一直在网上寻找样本,但不知道从哪里开始。对于像我这样的初学者来说,这项任务非常有用。提前谢谢。
预期产出:
<allimagesize>
<size>224 mm x 154 mm</size>
</allimagesize>
<remarks>
<message>The following image has different size</message>
<details>
image 3 size 225 mm x 155 mm
</details>
</remarks>
答案 0 :(得分:0)
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/assets">
<xsl:variable name="model-asset" select="asset[1]" />
<xsl:variable name="non-conforming-assets" select="asset[not(H=$model-asset/H and W=$model-asset/W)]" />
<root>
<allimagesize>
<size>
<xsl:value-of select="concat($model-asset/H, ' x ', $model-asset/W)"/>
</size>
</allimagesize>
<xsl:if test="$non-conforming-assets">
<remarks>
<message>The following image has different size</message>
<xsl:for-each select="$non-conforming-assets">
<details>
<xsl:value-of select="concat('image ', no, ' size ', H, ' x ', W)"/>
</details>
</xsl:for-each>
</remarks>
</xsl:if>
</root>
</xsl:template>
</xsl:stylesheet>
注意:
您的输出需要一个根元素才能成为格式良好的XML;
将多个事实打包到一个节点中,例如<details>image 3
size 225 mm x 155 mm</details>
不是很好的XML实践。