[Bug 29305] New: [XT30TS] number-3501, 3229, 4001

https://www.w3.org/Bugs/Public/show_bug.cgi?id=29305

            Bug ID: 29305
           Summary: [XT30TS]  number-3501, 3229, 4001
           Product: XPath / XQuery / XSLT
           Version: Candidate Recommendation
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: normal
          Priority: P2
         Component: XSLT 3.0 Test Suite
          Assignee: abel.online@xs4all.nl
          Reporter: tim@cbcl.co.uk
        QA Contact: public-qt-comments@w3.org
  Target Milestone: ---

Having concurred with these results for some years, after re-implementing
xsl:number carefully, I think the expected results are incorrect.  

Taking as an example nmber-3501, the input starts:

<!-- Test for source tree numbering -->
<doc>
  <title>Test for source tree numbering</title>
  <chapter>
    <title>First Chapter</title>

and the transformation applies

<xsl:template match="chapter//title">
  <xsl:number level="multiple" from="chapter"
      count="chapter|section|subsection[1]"
      format="A.1.a. "/>
  <xsl:value-of select="."/><xsl:text>
</xsl:text>
</xsl:template>

and the expected result given for the first chapter/title above is ". First
Chapter".

Following the rules for xsl:number level="multiple"

S = the title element with content "First Chapter"
(/doc[1]/chapter[1]/title[1])
F = first chapter node in document (/doc[1]/chapter[1])
A = first chapter node in document (/doc[1]/chapter[1])
AF = first chapter node in document (/doc[1]/chapter[1])

so 

 for $af in $AF
  return 1+count($af/preceding-sibling::node()[local:matches-count(.)])

gives 1 + count(()), i.e. 1, which should format as "A." (which seems correct
intuitively).

The following XQuery might help...

declare function local:matches-count($arg)
{
  typeswitch ($arg)
  case element(chapter) return true()
  case element(section) return true()
  case element(subsection) return ($arg/../subsection[1] is $arg)
  default return false()
};

declare function local:matches-from($arg)
{
  typeswitch ($arg)
  case element(chapter) return true()
  default return root($arg) is $arg
};


let $S := /doc[1]/chapter[1]/title[1]
let $A := $S/ancestor-or-self::node()[local:matches-count(.)]
let $F := $S/ancestor-or-self::node()[local:matches-from(.)][1]
let $AF := $A[ancestor-or-self::node()[. is $F]]
return
(
  "S = ", $S,
  "A = ", $A,
  "F = ", $F,
  "AF = ", $AF,

  for $af in $AF
  return 1+count($af/preceding-sibling::node()[local:matches-count(.)])
)

-- 
You are receiving this mail because:
You are the QA Contact for the bug.

Received on Wednesday, 25 November 2015 12:07:47 UTC