Xml 当一个特定的子标记使用xslt时,我想结束我的标记
因此,我的xml内容如下: 原始XML: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
<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来涵盖可能的情况;只能有一个根元素。