1

下面是我的 XML 结构:

<cars>  
  <car>  
    <ford color="black" >eco sport</ford>    
    <maruti color="red" >zen</maruti>  
    <hyundai color="blue" >accent</hyundai>  
  </car>  
  <car>  
    <ford color="green" >figo</ford >    
    <maruti color="red" >swift</maruti>  
    <hyundai color="white" >santro</hyundai>  
  </car> 
  <car>  
    <ford color="red" >aaa</ford >    
    <maruti color="red" >bbb</maruti>  
    <hyundai color="red" >ccc</hyundai>  
  <car>  
  </car>
    <ford color="white" >ddd</ford >    
    <maruti color="white" >eee</maruti>  
    <hyundai color="white" >fff</hyundai>  
  </car>
</cars>

从上面的 XML 结构中,我需要在 java 中有一个解析器,它将拆分 xml 并只返回一个只有 2 或 3 个元素的 xml(如 1-2 或 2-3 或 2-4),因为我将指定元素动态行。因此,如果我在方法中传递参数splitXML(2,3),我返回的新 xml 应该是这样的:

<cars>  
    <car>  
      <ford color="green" >figo</ford >    
      <maruti color="red" >swift</maruti>  
      <hyundai color="white" >santro</hyundai>  
    </car> 
    <car>  
      <ford color="red" >aaa</ford >    
      <maruti color="red" >bbb</maruti>  
      <hyundai color="red" >ccc</hyundai>  
    </car>  
</cars>  

有人可以帮助我吗?

4

3 回答 3

2

在 XSLT 2.0 中,您可以使用subsequence(). (我知道这个问题被标记为 1.0,但也许这会对未来的访问者有所帮助。)

XML 输入

<cars>  
    <car>  
        <ford color="black" >eco sport</ford>    
        <maruti color="red" >zen</maruti>  
        <hyundai color="blue" >accent</hyundai>  
    </car>  
    <car>  
        <ford color="green" >figo</ford >    
        <maruti color="red" >swift</maruti>  
        <hyundai color="white" >santro</hyundai>  
    </car> 
    <car>  
        <ford color="red" >aaa</ford >    
        <maruti color="red" >bbb</maruti>  
        <hyundai color="red" >ccc</hyundai>  
    </car>  
    <car>
        <ford color="white">ddd</ford>
        <maruti color="white">eee</maruti>
        <hyundai color="white">fff</hyundai>
    </car>
</cars>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:param name="start" select="2"/>
    <xsl:param name="end" select="3"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="cars">
        <xsl:copy>
            <xsl:apply-templates select="@*|subsequence(car,$start,($end - $start)+1)"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML 输出

<cars>
   <car>
      <ford color="green">figo</ford>
      <maruti color="red">swift</maruti>
      <hyundai color="white">santro</hyundai>
   </car>
   <car>
      <ford color="red">aaa</ford>
      <maruti color="red">bbb</maruti>
      <hyundai color="red">ccc</hyundai>
   </car>
</cars>
于 2013-08-19T16:37:59.690 回答
1

您可以使用基于身份转换的 xslt ,您可以将具有所需范围的参数传递到其中(如何完成的方式取决于您使用的 xslt 处理器)。XSLT 可能如下所示

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output method="xml" />

    <!-- Take a start and end position to be output as a parameters from outside-->
    <xsl:param name="startPosition"  />
    <xsl:param name="endPosition"  />

    <!-- Use "Identity transform" -->
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
    </xsl:template>

    <!-- When you are processing car element... -->
    <xsl:template match="car">
        <!-- ... take a look at its position. Copy it only if its position is in the desired range -->
        <xsl:if test="not((position() &lt; $startPosition) or (position() &gt; $endPosition))">
            <xsl:copy>
                <xsl:apply-templates select="node() | @*" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

使用值 startPosition = 2 和 endPosition = 3,您将获得以下输出

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <ford color="green">figo</ford>
        <maruti color="red">swift</maruti>
        <hyundai color="white">santro</hyundai>
    </car>
    <car>
        <ford color="red">aaa</ford>
        <maruti color="red">bbb</maruti>
        <hyundai color="red">ccc</hyundai>
    </car>
</cars>

这只是一个概念。实际上,您应该检查参数的一些约束,例如它们是否是数字,endPosition 是否不低于 startPosition 等。

于 2013-08-19T06:55:03.633 回答
0

您需要一个 XML 解析器。网上有很多资源。这是一个关于阅读和操作 XML的简单教程。

于 2013-08-19T05:22:58.170 回答