XSLT2.0,从派生元素中递归获取名为enum的祖先::子元素



更新:2012年9月18日下午晚些时候101.(a)在这里是多余的,是我需要的祖先:*[@belcode]。它们在下面的XML示例中,我还不知道如何不获取它们。

错误的XML输出示例:

<p style="I24">101.(a)(e)(1)(A) If the Attorney General determines that a licensee under this section has willfully violated any provision of this chapter or any regulation prescribed under this chapter, the Attorney General may&mdash;</p>

XSL,其中只有带有belcode的for的行为不好:

<xsl:choose>
<xsl:when test="../@display-inline='yes-display-inline'">
<xsl:for-each select="ancestor-or-self::*[@belcode!='' and not(../@belcode/text or ../@belcode/header)]/enum">      
<xsl:value-of select="."/>   
</xsl:for-each> 
<xsl:for-each select="ancestor-or-self::*[@display-inline='yes-display-inline']/enum">      
<xsl:value-of select="."/>   
</xsl:for-each> 
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../enum"/>
<xsl:text></xsl:text>
</xsl:otherwise>
</xsl:choose>

更新:2012年9月18日我测试了你给我的代码,但我的外部条件不起作用。。。另外,我使用的是XSLT2.0,所以不需要为每个都创建一个。

新的XML输出不能正常工作(太多的祖先),但我只在正确的p元素上得到它们:

<section number="101">
<title style="I72">SEC. 101. SECTION TITLE.</title>
<p style="I20">(a)cpk2 In General.&mdash;Section 923...</p>
<p style="I20">(e)</p>
<p style="I22">(1)</p>
<p style="I24">&ensp;&ensp;&ldquo;I 101. (a) (e) (1) (A)cpk1 If the ... may&mdash;</p>
<p style="I26">(i)cpk2 if the violation is of a minor nature&mdash;</p>
</section>

XSLT代码非常接近,我"认为"它需要更多的工作。我只需要从具有belcode属性的第一个祖先获取子enum元素,然后返回到作为文本元素父元素的子元素的enum。

我想我需要用一些东西来替换的值中的*,让我回到我想要的顶级祖先,我只是对XPath/XXSLT相当陌生,并且正在与语法作斗争。

<xsl:choose>
<xsl:when test="../@display-inline='yes-display-inline' and ancestor::*/@belcode[1]">
<xsl:value-of select="ancestor-or-self::*/enum"/>
<xsl:text>cpk1</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../enum"/>
<xsl:text>cpk2</xsl:text>
</xsl:otherwise>
</xsl:choose>

提前感谢您的任何建议。

如何从我的子条款文本节点(我保证我没有将元素命名为文本)向上树,直到我到达有代码的祖先,并且没有display-inline="yes-display-inline",并获得包含所有子"enum"的枚举?正在处理的所有祖先元素也没有标头或文本子元素,但有一个枚举。(是的,有一个XML示例)。

背景:

我已将XML输入嵌套到section/subon/partment/subon/subon/子句中(每个也可以有一个枚举、标头、文本子项)输出一个充满"p"的部分,与过去的风格不同subvels,其中"enum"、"header"、"text"都被放入"p"中。

我遇到的问题是,在某些情况下,就像下面的示例一样,只有一个或多个级别的枚举。输出段落应该获得不带"header"或"text"的FIRST级别的代码属性(转换为样式),以及该级别与具有"text"("p"包装器获得输出的级别)之间的所有"enum",以便适当地进行扁平化。用英语来说,我需要一个(p style="P20")(e)(1)(a)。

嵌套XML输入:

<section code="P72">
<enum>101.</enum>
<header>SECTION TITLE.</header>
<subsection code="P20">
<enum>(e)</enum>
<paragraph display-inline="yes-display-inline">
<enum>(1)</enum>
<subparagraph display-inline="yes-display-inline">
<enum>(A)</enum>
<text>If the ... may—</text>
<clause belcode="I24">
<enum>(i)</enum>
<text>if the violation is of a minor nature—</text>
</clause>
</subparagraph>
</paragraph>
</subsection>
</section>

期望输出:

<section number="101">
<title style="I72">SEC. 101. SECTION TITLE.</title>
<p style="I20">(a) In General.&mdash;Section 923...</p>
<p style="I20">(e)(1)(A) If the ... may&mdash;</p>
<p style="I24">(i) if the violation is of a minor nature&mdash;</p>
</section>

我得到的输出:

<section number="101">
<title style="I72">SEC. 101. SECTION TITLE.</title>
<p style="I20">(a) In General.&mdash;Section 923...</p>
<p style="I20">(e)</p>
<p style="I22">(1)</p>
<p style="I24">(A) If the ... may&mdash;</p>
<p style="I26">(i) if the violation is of a minor nature&mdash;</p>
</section>

不起作用的XSL代码段:

<xsl:template match="//subparagraph/text">
<p><xsl:attribute name="style"><xsl:value-of select="parent::subparagraph/@code"/></xsl:attribute>
<xsl:choose>
<xsl:when test="ancestor::*/enum and not(boolean(ancestor::*/header) or boolean(ancestor::*/text))"><xsl:value-of select="ancestor-or-self::*/enum"/><xsl:text> </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="../enum"/><xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</p><xsl:text>&#10;</xsl:text>
</xsl:when>
</xsl:template>

我意识到这只是//子段/文本部分,但它是需要显示输出枚举的部分,我知道一旦我把它们拿到我想要的地方,如何停止它们在其他地方显示。

我认为您一定在使用XSLT1.0,在XSLT1.0中,如果xsl:value-of元素被赋予多个节点作为参数,它会取第一个节点的值,而忽略其他节点。如果你在1.0中,我想你可能想尝试替换

<xsl:when test="ancestor::*/enum 
and not(boolean(ancestor::*/header) 
or boolean(ancestor::*/text))">
<xsl:value-of select="ancestor-or-self::*/enum"/>
<xsl:text> </xsl:text>
</xsl:when>

带有

<xsl:when test="ancestor::*/enum 
and not(boolean(ancestor::*/header) 
or boolean(ancestor::*/text))">
<xsl:for-each select="ancestor-or-self::*/enum">
<xsl:value-of select="concat(., ' ')"/>
</xsl:for-each>
</xsl:when>

注意:没有经过测试(而且容易出错:我不怎么使用xsl:for-each,因为我发现我在使用它时犯了很多错误),所以要仔细测试。

相关内容

  • 没有找到相关文章