当前位置: 首页 > 知识库问答 >
问题:

XSLT 2.0用于每个组

巫墨一
2023-03-14

我目前正在尝试将非常混乱的xml的一部分转换为更具可读性的内容,但当我的代码没有产生我想要的内容时。

我可以获得一些关于我的代码有什么问题以及如何修复它的反馈吗?

输入示例:

<root>
 <body>
   <para>
    <heading> name </heading>
   </para>
   <para> This is the name </para>
   <para>
    <heading> Usage </heading>
   </para>
   <para> This is the usage </para>
 </body>
<root>

我想看到的输出是:

<root>
 <conbody>
  <section>
   <title> Name </title>
   <p> This is the name </p>
  </section>
  <section>
   <title> Usage </title>
   <p> This is the usage </p>
 <conbody>
<root>

我的代码当前如下所示:

<xsl:template match="body">
    <conbody>
        <xsl:for-each-group select="para" group-starting-with="para[heading]">
            <section>
                <title>
                    <xsl:apply-templates select="element()"/>
                </title>
                <p>
                    <xsl:apply-templates select="*"/>
                </p>
            </section>
        </xsl:for-each-group>
    </conbody>
</xsl:template>

内容没有被正确复制,我不知道为什么?

共有1个答案

汪耀
2023-03-14

这是因为您需要将模板应用于current-group()

您可以尝试在第一个xsl中使用当前组()[1]:应用模板当前组()[not(位置()=1)]在第二个xsl:应用模板中;这应该会让您接近。

下面是一个稍微不同的方法示例,用于创建标题和p元素。。。

XML输入

<root>
    <body>
        <para>
            <heading> name </heading>
        </para>
        <para> This is the name </para>
        <para>
            <heading> Usage </heading>
        </para>
        <para> This is the usage </para>
    </body>
</root>

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

  <xsl:template match="body">
    <conbody>
      <xsl:for-each-group select="para" group-starting-with="para[heading]">
        <section>
          <xsl:apply-templates select="current-group()"/>
        </section>
      </xsl:for-each-group>
    </conbody>
  </xsl:template>

  <xsl:template match="para">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="para/text()">
    <p><xsl:value-of select="."/></p>
  </xsl:template>

  <xsl:template match="heading">
    <title><xsl:apply-templates/></title>
  </xsl:template>

</xsl:stylesheet>

XML输出

<root>
   <conbody>
      <section>
         <title> name </title>
         <p> This is the name </p>
      </section>
      <section>
         <title> Usage </title>
         <p> This is the usage </p>
      </section>
   </conbody>
</root>
 类似资料:
  • 我试图集成Camel以使用XSLT2.0,但遇到一个异常,无法“编译样式表” 我的骆驼配置路线在下面 还放置了xalan。jar和saxon9he。JAVA_HOME/lib/endroved目录下的jar。还有什么我需要做的吗

  • 这是一个非常基本的问题,但我不理解for each group是如何工作的。我想把没有子节的相邻顶层节合并到一个列表中。如果有带有小节的部分,我想以不同的方式对待它们,保持顶层不变,并将子部分合并到一个列表中。我不想把这些混为一谈。 源XML 期望的结果 XSLT片段这绝对是不正确的。此外,这不是我尝试过的唯一方式,只是最不混乱的帖子。我认为对于每个组应该工作的方式是,我一直得到一个错误,不允许将

  • 我正在阅读“Spring MVC,初学者指南”这本书。在一节中,它建议使用矩阵变量来传递一个高价格和低价格。在他们的示例中,声明指定了一个字符串列表作为第二个参数(见下文)。 但是,由于每个键只有一个值,我想我会尝试声明: 当我尝试访问与存储在中的特定键相关联的“value”(使用和时,我不断得到运行时的错误。 当我在debug中检查priceParams时,数据类型显示为,目标映射显示为。 我开

  • 问题内容: 这是Java代码的片段: 它显示5。但是为什么声明了for循环的声明部分,却没有声明? 在uu上,您将引用2D数组…这不是一项作业。我正在准备Java认证。干杯 问题答案: 由于你是一个。因此,当您对其进行迭代时,您将首先获得,然后可以对该数组进行迭代以获取单个元素。 因此,您的外部循环具有as类型,因此具有该声明。如果您在另一个内循环中进行迭代,则将得到以下类型:-

  • 我能够在Java中使用XSLT1.0,如以下示例所示:- copy.xml copy.xsl copy.java 输出

  • 那么,让我先展示一下代码。 所以,正如你所猜测的,我正在研究LinkedList。所以,对于一个给定的值作为一个函数中的参数; 特别是,我们能用这个等式符号“==”来表示对象类吗?一般来说,除了字符串,我们能在任何类中使用“==”吗?如果是字符串,那么就不是。如果是整数,那么肯定是。但是现在,你怎么能比较呢?