如何使用 XSLT 只获取某些行和某些列? [英] How to use XSLT to get only certain rows and certain columns?
本文介绍了如何使用 XSLT 只获取某些行和某些列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何使用 XSLT 转换此 XML 文件:
How can I use XSLT to convert this XML file:
<file>
<row>
<cell></cell>
<cell>(info...)</cell>
<cell></cell>
</row>
<row>
<cell>first name</cell>
<cell>last name</cell>
<cell>age</cell>
</row>
<row>
<cell>Jim</cell>
<cell>Smith</cell>
<cell>34</cell>
</row>
<row>
<cell>Roy</cell>
<cell>Rogers</cell>
<cell>22</cell>
</row>
<row>
<cell>Hank</cell>
<cell>Grandier</cell>
<cell>23</cell>
</row>
<row>
<cell>(info...)</cell>
<cell></cell>
<cell>(info...)</cell>
</row>
<row>
<cell>Sally</cell>
<cell>Cloud</cell>
<cell>26</cell>
</row>
<row>
<cell>John</cell>
<cell>Randall</cell>
<cell>44</cell>
</row>
</file>
到这个 XML 文件:
to this XML file:
<file>
<row>
<cell>Jim</cell>
<cell>34</cell>
</row>
<row>
<cell>Roy</cell>
<cell>22</cell>
</row>
<row>
<cell>Sally</cell>
<cell>26</cell>
</row>
<row>
<cell>John</cell>
<cell>44</cell>
</row>
</file>
基本上规则是:
- 仅第一列和第三列(名字和年龄)
- 仅在特定范围内的行,例如在上面的简单示例中,它将是第 3-5 行 和 第 7-8 行,因此我假设我需要某种包含此信息的映射表立>
- only first and third column (first name and age)
- only rows within certain ranges, e.g. in the simple example above it would be rows 3-5 and rows 7-8 so I would assume I would need some kind of mapping table with this information in it
这是我使用 MarcoS 关于参数的提示的解决方案:
Here is my solution using MarcoS's tip about params:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
<xsl:param name="range-1-begin" select="3"/>
<xsl:param name="range-1-end" select="4"/>
<xsl:param name="range-2-begin" select="6"/>
<xsl:param name="range-2-end" select="7"/>
<xsl:template match="file">
<marco>
<xsl:for-each select="row">
<xsl:if test="(position() >= $range-1-begin and position() <= $range-1-end)
or (position() >= $range-2-begin and position() <= $range-2-end)">
<row>
<xsl:for-each select="cell">
<xsl:if test="position() = 1 or
position() = 3">
<cell>
<xsl:value-of select="."/>
</cell>
</xsl:if>
</xsl:for-each>
</row>
</xsl:if>
</xsl:for-each>
</marco>
</xsl:template>
</xsl:stylesheet>
推荐答案
这是一个可能的解决方案(可能不是很优雅):
This is a possible solution (maybe not very elegant):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" />
<xsl:template match="file">
<file>
<xsl:for-each select="row">
<xsl:if test="(position() >= 3 and position() < 5)
or (position() >= 7 and position() <= 8)">
<row>
<xsl:for-each select="cell">
<xsl:if test="position() = 1 or
position() = 3">
<cell>
<xsl:value-of select="."/>
</cell>
</xsl:if>
</xsl:for-each>
</row>
</xsl:if>
</xsl:for-each>
</file>
</xsl:template>
</xsl:stylesheet>
本质上,您可以使用 XPath position()
函数来选择您想要的 row
和 cell
元素的范围.
Essentially, you can use XPath position()
function to select the ranges of row
and cell
elements that you want.
这篇关于如何使用 XSLT 只获取某些行和某些列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文