Xml 当一个特定的子标记使用xslt时,我想结束我的标记

Xml 当一个特定的子标记使用xslt时,我想结束我的标记,xml,xslt-1.0,Xml,Xslt 1.0,因此,我的xml内容如下: 原始XML: <p id="ACB1234" trackparabreak="true"> <t> <apple>Some texts</apple> <p trackparabreak="true"> <t> Some texts </t> </p> <orang

因此,我的xml内容如下:

原始XML:

 <p id="ACB1234" trackparabreak="true">
   <t>
     <apple>Some texts</apple>          
        <p trackparabreak="true">
            <t> Some texts </t>
        </p>
     <orange>Some Texts</orange>
   </t>
 </p>
期望输出:

 <p id="ACB1234" trackparabreak="true">
      <t>
        <apple>Some texts</apple>
      </t>
   </p>
   <p trackparabreak="true">
      <t>  Some texts </t>
   </p>
   <p>
      <t>
        <orange> Some Texts </orange>
      <t>
   <p>

我们如何使用xslt-1.0获得所需的输出?

正如我在您的问题下面的评论中所说,没有足够的信息涵盖所有情况,但是通过调整下面的xslt,您可能可以实现您所需要的。警告:黑客!todo:处理属性并规范化空间

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

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

<xsl:template match="p[not(ancestor::p)]">
    <p>
        <t>
            <xsl:apply-templates select="t/apple"/>
        </t>
    </p>
    <xsl:apply-templates select="t/*[not(self::apple)]"/>
</xsl:template>

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

<xsl:template match="p[ancestor::p]">
    <p>
        <t>
            <xsl:apply-templates/>
        </t>
    </p>
</xsl:template>

<xsl:template match="orange">
    <p>
        <t>
            <orange>
                <xsl:apply-templates/>
            </orange>
        </t>
    </p>
</xsl:template>

</xsl:stylesheet>
输入:

<p id="ACB1234" trackparabreak="true">
  <t>
    <apple>APPLE TEXT</apple>          
    <p trackparabreak="true">
        <t>PARA INSIDE TEXT</t>
    </p>
    <orange>ORANGE TEXT</orange>
  </t>
</p>
输出:

<root>
  <p>
    <t>
        <apple>APPLE TEXT</apple>
    </t>
  </p>
  <p>
    <t> PARA INSIDE TEXT </t>
  </p>
  <p>
    <t>
        <orange>ORANGE TEXT</orange>
    </t>
  </p>
</root>

XSLT不会在串行输出文件中创建标记,而是在树中创建节点。创建元素节点是一个不可分割的操作,不能在不同的时间将节点的开始和结束创建为独立的操作。因此,在处理过程中,你头脑中的模型是错误的,这将使问题难以解决

尽管@Marcin猜测问题出在苹果和橙子上,但我的猜测是它与破解属性有关。也许她是对的,我是错的,但你解释得太糟糕了,我们只能猜测

这是一个棘手的问题,我不打算把时间花在一个完整的解决方案上,部分原因是在XSLT2.0中这样做要容易得多,我讨厌一只手绑在背后工作,部分原因是在需求不明确的情况下编写大量代码毫无意义。例如,我不知道如何处理没有trackparabreak属性的,因为您的示例中没有trackparabreak属性


解决这类问题的常用技术是同级递归。这里的模型是,在父元素的模板规则中,将模板应用于第一个子元素:*[1],在子元素的模板规则中,处理子元素后,将模板应用于下一个同级元素:*[1];除非遇到诸如trackparabreak之类的中断条件,在这种情况下,停止同级递归并展开堆栈。

您能给我们提供更多详细信息吗,规则是什么?为什么停留在第一个p/t内,其余的被移动?给定的示例/输出不足以编写适当的XSLT来涵盖可能的情况;只能有一个根元素。