1

更新: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-each 表现不佳:

<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 日我测试了你给我的代码,但我的外部条件不起作用......另外,我使用的是 XSLT 2.0,所以不需要 for-each。

新的 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 属性的第一个祖先获取子枚举元素,然后返回到作为我的文本元素父元素的子元素的枚举。

我想我需要用可以让我回到我想要的顶级祖先的东西替换 value-of 中的 *,我对 XPath/XSLT 还很陌生,并且与语法作斗争。

<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”,并获得所有子“枚举”的包容性?途中的所有祖先元素也没有标题或文本子元素,但有一个枚举。(是的,有一个 XML 示例)。

背景:

我已经将 XML输入嵌套在 section/subsection/paragraph/subparagraph/clause 中(每个都可以有一个 enum、header、text child),它被展平以 输出一个充满“p”的部分,其中使用了不同的样式成为子级别,其中“枚举”、“标题”、“文本”都放入“p”中。

我遇到问题的地方是,在某些情况下,就像我下面的示例一样,只有一个或多个级别的枚举。输出段落应该获得没有“标题”或“文本”的 FIRST 级别的代码属性(转换为样式),以及该级别与具有“文本”的级别之间的所有“枚举”,这就是“p”包装器获得输出,以便适当地进行展平。用英文来说,我需要一个 (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—&lt;/text>
<clause belcode="I24">
<enum>(i)</enum>
<text>if the violation is of a minor nature—&lt;/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>

我意识到这只是 //subparagraph/text 片段,但它是需要显示输出枚举的部分,并且我知道如何停止它们在其他地方显示,一旦我将它们放在我想要的位置。

4

1 回答 1

0

我认为您必须在 XSLT 1.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的不多,因为我发现我用它犯了很多错误),所以仔细测试。

于 2012-09-17T20:17:42.950 回答