Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT:将未分组的数据拆分为块_Xslt_Xslt 2.0 - Fatal编程技术网

XSLT:将未分组的数据拆分为块

XSLT:将未分组的数据拆分为块,xslt,xslt-2.0,Xslt,Xslt 2.0,我需要转身 <question> <static><![CDATA[Static Data]]></static> <debit-row /> <debit-row /> <credit-row /> <header><![CDATA[Header HTML 1]]></header> <d

我需要转身

   <question>
      <static><![CDATA[Static Data]]></static>

      <debit-row />
      <debit-row />
      <credit-row />

      <header><![CDATA[Header HTML 1]]></header>
      <debit-row />
      <debit-row />
      <credit-row />
   </question>

进入

静态数据

  • 借方行 信贷行 信贷行
  • 标题HTML 1 借方行 借方行 信贷行
从本质上讲,表头或借方行都表示新区块的开始。每个区块都是一个列表项。每个集合或行都是一个表(通常,信用行总是排在最后,因此很容易判断何时开始该表)

XSLT和XPATH看起来非常困难,我很难找到任何我想做的事情,所以如果有人有一个很好的参考资料,我也会很感激

我从以下xsl开始:

<xsl:template match="question">
   <xsl:apply-templates select="static|header|debit-row[preceding-sibling::*[1] != header]" />
</xsl:template>

这不是一个好的开始,因为模板根本不应用于任何借方行,但它们应该应用于第一个借方行(它前面没有header元素)。这个表达错了吗

即使我能做到这一点,我也需要找到一种方法说“如果这是第一个标题行或借方行,请打开一个
”,我不知道在应用标题行/借方行模板时如何做到这一点。借方行中的每一行都有自己的xml要应用(它需要一个表行和td)。我还必须在第一个借方行之前和最后一个贷方行之后适当地打开和关闭表


我非常感谢任何帮助,因为我甚至无法让上面的简单xpath表达式正常工作。

I.XSLT 1.0解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
 <xsl:key name="kFollowing"
  match="*[not(self::static or self::header)]"
  use="generate-id(preceding-sibling::*
                              [self::static
                              or
                               self::header
                              ][1]
                  )"/>

 <xsl:template match="/*[static]">
  <p><xsl:value-of select="static"/></p>
  <ul>
    <xsl:apply-templates select="static|header"/>
  </ul>
 </xsl:template>

 <xsl:template match="static|header">
  <li>
    <xsl:value-of select=
     "concat(self::header, '&#xA;')"/>
    <table>
     <xsl:apply-templates
       select="key('kFollowing', generate-id())"/>
    </table>
  </li>
 </xsl:template>

 <xsl:template match=
  "*/*[not(self::static or self::header)]">
  <tr>
    <td>
     <xsl:value-of select=
      "translate(name(),'-', ' ')"/>
    </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>
<question>
    <static><![CDATA[Static Data]]></static>
    <debit-row />
    <debit-row />
    <credit-row />
    <header><![CDATA[Header HTML 1]]></header>
    <debit-row />
    <debit-row />
    <credit-row />
</question>
<p>Static Data</p>
<ul>
   <li>

      <table>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>credit row</td>
         </tr>
      </table>
   </li>
   <li>Header HTML 1
<table>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>credit row</td>
         </tr>
      </table>
   </li>
</ul>
<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*[static]">
  <p><xsl:value-of select="static"/></p>
  <ul>
    <xsl:for-each-group select="*"
         group-starting-with="static|header">
      <li>
        <xsl:value-of separator="&#xA;" select=
         "current-group()[1][self::header], ''"/>
        <table>
         <xsl:apply-templates
           select="current-group()[position() gt 1]"/>
        </table>
      </li>
    </xsl:for-each-group>
  </ul>
 </xsl:template>

 <xsl:template match=
  "*/*[not(self::static or self::header)]">
  <tr>
    <td>
     <xsl:value-of select=
      "translate(name(),'-', ' ')"/>
    </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>
<p>Static Data</p>
<ul>
   <li>
      <table>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>credit row</td>
         </tr>
      </table>
   </li>
   <li>Header HTML 1
<table>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>debit row</td>
         </tr>
         <tr>
            <td>credit row</td>
         </tr>
      </table>
   </li>
</ul>

  • 应用于提供的XML文档时

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:key name="kFollowing"
      match="*[not(self::static or self::header)]"
      use="generate-id(preceding-sibling::*
                                  [self::static
                                  or
                                   self::header
                                  ][1]
                      )"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:apply-templates select="static|header"/>
      </ul>
     </xsl:template>
    
     <xsl:template match="static|header">
      <li>
        <xsl:value-of select=
         "concat(self::header, '&#xA;')"/>
        <table>
         <xsl:apply-templates
           select="key('kFollowing', generate-id())"/>
        </table>
      </li>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <question>
        <static><![CDATA[Static Data]]></static>
        <debit-row />
        <debit-row />
        <credit-row />
        <header><![CDATA[Header HTML 1]]></header>
        <debit-row />
        <debit-row />
        <credit-row />
    </question>
    
    <p>Static Data</p>
    <ul>
       <li>
    
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:for-each-group select="*"
             group-starting-with="static|header">
          <li>
            <xsl:value-of separator="&#xA;" select=
             "current-group()[1][self::header], ''"/>
            <table>
             <xsl:apply-templates
               select="current-group()[position() gt 1]"/>
            </table>
          </li>
        </xsl:for-each-group>
      </ul>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <p>Static Data</p>
    <ul>
       <li>
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    
    
    生成所需的正确结果

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:key name="kFollowing"
      match="*[not(self::static or self::header)]"
      use="generate-id(preceding-sibling::*
                                  [self::static
                                  or
                                   self::header
                                  ][1]
                      )"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:apply-templates select="static|header"/>
      </ul>
     </xsl:template>
    
     <xsl:template match="static|header">
      <li>
        <xsl:value-of select=
         "concat(self::header, '&#xA;')"/>
        <table>
         <xsl:apply-templates
           select="key('kFollowing', generate-id())"/>
        </table>
      </li>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <question>
        <static><![CDATA[Static Data]]></static>
        <debit-row />
        <debit-row />
        <credit-row />
        <header><![CDATA[Header HTML 1]]></header>
        <debit-row />
        <debit-row />
        <credit-row />
    </question>
    
    <p>Static Data</p>
    <ul>
       <li>
    
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:for-each-group select="*"
             group-starting-with="static|header">
          <li>
            <xsl:value-of separator="&#xA;" select=
             "current-group()[1][self::header], ''"/>
            <table>
             <xsl:apply-templates
               select="current-group()[position() gt 1]"/>
            </table>
          </li>
        </xsl:for-each-group>
      </ul>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <p>Static Data</p>
    <ul>
       <li>
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    静态数据

    • 借方行 借方行 信贷行
    • 标题HTML 1 借方行 借方行 信贷行
    说明:使用键定义属于组的所有元素的位置分组


    II。XSLT 2.0解决方案

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:key name="kFollowing"
      match="*[not(self::static or self::header)]"
      use="generate-id(preceding-sibling::*
                                  [self::static
                                  or
                                   self::header
                                  ][1]
                      )"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:apply-templates select="static|header"/>
      </ul>
     </xsl:template>
    
     <xsl:template match="static|header">
      <li>
        <xsl:value-of select=
         "concat(self::header, '&#xA;')"/>
        <table>
         <xsl:apply-templates
           select="key('kFollowing', generate-id())"/>
        </table>
      </li>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <question>
        <static><![CDATA[Static Data]]></static>
        <debit-row />
        <debit-row />
        <credit-row />
        <header><![CDATA[Header HTML 1]]></header>
        <debit-row />
        <debit-row />
        <credit-row />
    </question>
    
    <p>Static Data</p>
    <ul>
       <li>
    
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:for-each-group select="*"
             group-starting-with="static|header">
          <li>
            <xsl:value-of separator="&#xA;" select=
             "current-group()[1][self::header], ''"/>
            <table>
             <xsl:apply-templates
               select="current-group()[position() gt 1]"/>
            </table>
          </li>
        </xsl:for-each-group>
      </ul>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <p>Static Data</p>
    <ul>
       <li>
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    
    

    将此XSLT 2.0转换应用于相同的XML文档(如上所述)时,同样会产生相同的正确结果

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
     <xsl:key name="kFollowing"
      match="*[not(self::static or self::header)]"
      use="generate-id(preceding-sibling::*
                                  [self::static
                                  or
                                   self::header
                                  ][1]
                      )"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:apply-templates select="static|header"/>
      </ul>
     </xsl:template>
    
     <xsl:template match="static|header">
      <li>
        <xsl:value-of select=
         "concat(self::header, '&#xA;')"/>
        <table>
         <xsl:apply-templates
           select="key('kFollowing', generate-id())"/>
        </table>
      </li>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <question>
        <static><![CDATA[Static Data]]></static>
        <debit-row />
        <debit-row />
        <credit-row />
        <header><![CDATA[Header HTML 1]]></header>
        <debit-row />
        <debit-row />
        <credit-row />
    </question>
    
    <p>Static Data</p>
    <ul>
       <li>
    
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    <xsl:stylesheet version="2.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="/*[static]">
      <p><xsl:value-of select="static"/></p>
      <ul>
        <xsl:for-each-group select="*"
             group-starting-with="static|header">
          <li>
            <xsl:value-of separator="&#xA;" select=
             "current-group()[1][self::header], ''"/>
            <table>
             <xsl:apply-templates
               select="current-group()[position() gt 1]"/>
            </table>
          </li>
        </xsl:for-each-group>
      </ul>
     </xsl:template>
    
     <xsl:template match=
      "*/*[not(self::static or self::header)]">
      <tr>
        <td>
         <xsl:value-of select=
          "translate(name(),'-', ' ')"/>
        </td>
      </tr>
     </xsl:template>
    </xsl:stylesheet>
    
    <p>Static Data</p>
    <ul>
       <li>
          <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
       <li>Header HTML 1
    <table>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>debit row</td>
             </tr>
             <tr>
                <td>credit row</td>
             </tr>
          </table>
       </li>
    </ul>
    
    静态数据

    • 借方行 借方行 信贷行
    • 标题HTML 1 借方行 借方行 信贷行
    解释:使用XSLT 2.0
    指令和以属性开头的
    组。还可以使用标准XSLT 2.0函数
    current-group()