【问题标题】:How to transform this xml with xslt?如何用 xslt 转换这个 xml?
【发布时间】:2018-07-05 10:57:15
【问题描述】:

我有以下 XML:

<dev>
    <niv1>
        <int>blablabla</int>
        <auteur>blablabla</auteur>
        <exer>
            <p align="justif">blablabla</p>
        </exer>
    </niv1>
    <sign>M. A.</sign>
    <p align="justif">
        <pc>blablabla</pc>: blablabla2
    </p>

    <niv1>
        <int>blablabla</int>
        <auteur>blablabla</auteur>
        <exer>
            <p align="justif">blablabla</p>
        </exer>
    </niv1>
    <sign>M. A.</sign>
    <p align="justif">
        <pc>blablabla</pc>: blablabla2
    </p>
    <!--Same pattern over and over again-->
</dev>

我想要类似的东西

<article>
  <content>
    <div>
       <some tags>xxxx</some tags>
    </div>
    <span class="sign">xxx</span>
     <p class="ref">
        <p class="mini-caps">xxxx</p>: 
     </p>
   </content>
</article>

我现在的 xml 输出如下所示:

<article>
  <content>
    <div>
       <some tags>xxxx</some tags>
    </div>
   </content>
</article>
<span class="sign">xxx</span>
<p class="ref">
      <p class="mini-caps">xxxx</p>: 
</p>

我无法将最后一个 spanp 元素放在 content 标记中。

我的 XSLT 类似于(这里不是所有文件):

<xsl:template match="niv1">
    <article>
        <content>
            <div>
                <xsl:apply-templates mode="content"/>
            </div>
            <xsl:apply-templates select="sign"/>
        </content>
    </article>
</xsl:template>

<xsl:template match="sign">
    <span class="sign">
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="p">
    <p class="ref">
        <xsl:apply-templates/>
    </p>
</xsl:template>

<xsl:template match="pc">
    <p class="mini-caps">
        <xsl:apply-templates/>
    </p>
</xsl:template>

我不知道是否有可能实现我想要的,因为当我匹配&lt;niv1&gt;&lt;sign&gt;&lt;p&gt; 不是niv1 的子节点时。我不经常使用 XSLT,而且我还是个初学者。

【问题讨论】:

    标签: xml xslt


    【解决方案1】:

    您需要进行一些更改才能将signp 兄弟姐妹移动为niv1 的子代。

    修改匹配niv1的模板如下。在此模板中,niv1 之后出现的第一个兄弟姐妹 signp 已使用一种模式作为其子代,以便以后可以删除兄弟姐妹。

    <xsl:template match="niv1">
        <article>
            <content>
                <div>
                    <xsl:apply-templates mode="content"/>
                </div>
                <xsl:apply-templates select="following-sibling::sign[1]" mode="alter-sign" />
                <xsl:apply-templates select="following-sibling::p[1]" mode="alter-p" />
            </content>
        </article>
    </xsl:template>
    

    一种模式应用于以下模板

    <xsl:template match="sign" mode="alter-sign">
        <span class="sign">
            <xsl:apply-templates />
        </span>
    </xsl:template>
    
    <xsl:template match="p" mode="alter-p">
        <p class="ref">
            <xsl:apply-templates />
        </p>
    </xsl:template>
    

    删除任何其他出现的signp

    <xsl:template match="sign | p" />
    

    这些更改提供了以下输出(因为在共享输入中出现了 2 次 niv1,所以输出显示了 2 个 article 节点)。

    <article>
        <content>
            <div>blablablablablablablablabla</div>
            <span class="sign">M. A.</span>
            <p class="ref">
                <p class="mini-caps">blablabla</p>  : blablabla2
            </p>
        </content>
    </article>
    <article>
        <content>
            <div>blablablablablablablablabla</div>
            <span class="sign">M. A.</span>
            <p class="ref">
                <p class="mini-caps">blablabla</p>  : blablabla2
            </p>
        </content>
    </article>
    

    【讨论】:

      猜你喜欢
      • 2019-05-30
      • 2021-12-22
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多