【问题标题】:XSLT - get original attributes to the result treeXSLT - 获取结果树的原始属性
【发布时间】:2015-09-18 16:51:59
【问题描述】:

我有这样的xml,

<doc>
    <section type="Main_Content">
        <p id="main">aa</p>
        <p id="main">bb</p>
        <p id="main">cc</p>
        <p id="para1">dd</p>
        <p id="main">ee</p>
        <p id="main">ff</p>
        <p id="para2">hh</p>
        <p id="main">ii</p>
        <p id="main">jj</p>
        <p id="para1">xx</p>
        <p id="main">yy</p>

    </section>
    <section type="Main_Chapter">
        <p id="main">ii</p>
        <p id="main">jj</p>
        <p id="para1">xx</p>
        <p id="main">yy</p>
        <p id="main">zz</p>    
    </section>
</doc>

我的任务是根据 id="para1" 和 id='para2' 属性对上述内容进行分组,并为每个组添加一个部分。我想要的输出是

<doc>
    <section type="Main_Content">
        <p id="main">aa</p>
        <p id="main">bb</p>
        <p id="main">cc</p>
    </section>
    <section type="First para">
        <p id="para1">dd</p>
        <p id="main">ee</p>
        <p id="main">ff</p>
    </section>
    <section type="Second para">
        <p id="para2">hh</p>
        <p id="main">ii</p>
        <p id="main">jj</p>
    </section>
    <section type="First para">
        <p id="para1">xx</p>
        <p id="main">yy</p>
    </section>
    <section type="Main_Chapter">
        <p id="main">ii</p>
        <p id="main">jj</p>
    </section>
    <section type="First para">
        <p id="para1">xx</p>
        <p id="main">yy</p>
        <p id="main">zz</p>
    </section>
</doc>

这个任务的 XSL 代码是,

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

    <xsl:template match="section">
        <xsl:for-each-group select="p" group-starting-with="p[starts-with(@id, 'para')]">
            <section type="{@type}">
                <xsl:if test="current-group()[1][@id='para1']">
                    <xsl:attribute name="type" select="'First para'"/>
                </xsl:if>
                <xsl:if test="current-group()[1][@id='para2']">
                    <xsl:attribute name="type" select="'Second para'"/>
                </xsl:if>
                <xsl:apply-templates select="current-group()"/>
            </section>      
        </xsl:for-each-group>
    </xsl:template>

从上面xsl得到的结果是,

<doc>
    <section type="">
        <p id="main">aa</p>
        <p id="main">bb</p>
        <p id="main">cc</p>
    </section>
    <section type="First para">
        <p id="para1">dd</p>
        <p id="main">ee</p>
        <p id="main">ff</p>
    </section>
    <section type="Second para">
        <p id="para2">hh</p>
        <p id="main">ii</p>
        <p id="main">jj</p>
    </section>
    <section type="First para">
        <p id="para1">xx</p>
        <p id="main">yy</p>
    </section>
    <section type="">
        <p id="main">ii</p>
        <p id="main">jj</p>
    </section>
    <section type="First para">
        <p id="para1">xx</p>
        <p id="main">yy</p>
        <p id="main">zz</p>
    </section>
</doc>

所以,结果似乎是正确的,除了原始的type 属性没有复制到&lt;section&gt; 节点。如何修改 xsl 以将原始 type 属性值设置为 &lt;section&gt; 节点?

【问题讨论】:

    标签: xml xslt xslt-2.0


    【解决方案1】:

    问题出在所提供代码的这一部分:

    <xsl:template match="section">
        <xsl:for-each-group select="p" group-starting-with="p[starts-with(@id, 'para')]">
            <section type="{@type}">
    

    请注意上下文(当前)项是一个p 元素,并且在提供的源 XML 文档中没有一个具有type 属性。

    这里需要p 元素的父级的type 属性

    解决方案

    替换:

            <section type="{@type}">
    

    与:

            <section type="{../@type}">
    

    现在整个转变变成了

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
    
     <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
     </xsl:template>
    
     <xsl:template match="section">
       <xsl:for-each-group select="p"  group-starting-with="p[starts-with(@id, 'para')]">
          <section type="{../@type}">
            <xsl:if test="current-group()[1][@id='para1']">
               <xsl:attribute name="type" select="'First para'"/>
             </xsl:if>
             <xsl:if test="current-group()[1][@id='para2']">
                <xsl:attribute name="type" select="'Second para'"/>
              </xsl:if>
              <xsl:apply-templates select="current-group()"/>
          </section>      
       </xsl:for-each-group>
     </xsl:template>
    </xsl:stylesheet>
    

    当应用于提供的源 XML 文档时

    <doc>
        <section type="Main_Content">
            <p id="main">aa</p>
            <p id="main">bb</p>
            <p id="main">cc</p>
            <p id="para1">dd</p>
            <p id="main">ee</p>
            <p id="main">ff</p>
            <p id="para2">hh</p>
            <p id="main">ii</p>
            <p id="main">jj</p>
            <p id="para1">xx</p>
            <p id="main">yy</p>
        </section>
        <section type="Main_Chapter">
            <p id="main">ii</p>
            <p id="main">jj</p>
            <p id="para1">xx</p>
            <p id="main">yy</p>
            <p id="main">zz</p>
        </section>
    </doc>
    

    产生了想要的正确结果:

    <doc>
       <section type="Main_Content">
          <p id="main">aa</p>
          <p id="main">bb</p>
          <p id="main">cc</p>
       </section>
       <section type="First para">
          <p id="para1">dd</p>
          <p id="main">ee</p>
          <p id="main">ff</p>
       </section>
       <section type="Second para">
          <p id="para2">hh</p>
          <p id="main">ii</p>
          <p id="main">jj</p>
       </section>
       <section type="First para">
          <p id="para1">xx</p>
          <p id="main">yy</p>
       </section>
          <section type="Main_Chapter">
          <p id="main">ii</p>
          <p id="main">jj</p>
       </section>
       <section type="First para">
          <p id="para1">xx</p>
          <p id="main">yy</p>
          <p id="main">zz</p>
       </section>
    </doc>
    

    【讨论】:

      猜你喜欢
      • 2021-03-19
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多