(XSLT) Теги нумерации со значениями атрибутов - PullRequest
0 голосов
/ 24 сентября 2018

Итак, я получил, например, этот xhtml-файл (https://xsltfiddle.liberty -development.net / bdxtqF ):

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body>
    <p>first line</p>
    <p>second line</p>
    <p>third line</p>
    <p>forth line</p>
    <p>fifth line</p>
</body>

Я хочу пронумеровать числотеги, но их значение следует рассматривать как атрибут id.Я знаю, что вы можете использовать xsl: number, но я знаю только, как нумеровать внутри узлов:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="#all"
    version="3.0">

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

   <xsl:template match="p">
        <p><xsl:number/>. <xsl:apply-templates /></p>
   </xsl:template>

</xsl:stylesheet>

Но мой желаемый результат должен выглядеть следующим образом

<?xml version="1.0" encoding="UTF-8"?>



<test>
    <p id="1">first line</p>
    <p id="2">second line</p>
    <p id="3">third line</p>
    <p id="4">forth line</p>
    <p id="5">fith line</p>
</test>

Как мне создатьимя атрибута внутри тега и начать нумерацию значений внутри него?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Как Тим уже показал вам, вы можете использовать xsl:attribute для создания узла атрибута и заполнить его значение xsl:number.

Однако в XSLT 2 или 3 вы также можете использовать значение атрибуташаблонный подход, который Тим показал для использования position() и вместо этого вызывает свою собственную функцию, которая затем использует xsl:number с атрибутом select:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.w3.org/1999/xhtml"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all"
    version="2.0">

   <xsl:function name="mf:number">
       <xsl:param name="node" as="node()"/>
       <xsl:number select="$node"/>
   </xsl:function>

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

   <xsl:template match="p">
       <p id="{mf:number(.)}">
           <xsl:apply-templates/>
       </p>
   </xsl:template>

</xsl:stylesheet>

http://xsltransform.hikmatu.com/eiZQaEL - рабочий пример XSLT 2, https://xsltfiddle.liberty -development.net / bdxtqF / 1 то же самое для XSLT 3 (https://www.w3.org/TR/xslt-30/#element-number).

0 голосов
/ 24 сентября 2018

Вы можете использовать xsl:attribute здесь для создания атрибута

<xsl:template match="p">
 <p>
   <xsl:attribute name="id">
     <xsl:number />
   </xsl:attribute>
   <xsl:apply-templates />
 </p>
</xsl:template>

В качестве альтернативы, если вы добавите strip-space к вашей таблице стилей, вы можете использовать position()

<xsl:strip-space elements="*" />

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

<xsl:template match="p">
  <p id="{position()}">
    <xsl:apply-templates />
  </p>
</xsl:template>

Без strip-space xsl:apply-templates выделит текстовые узлы с пробелами, которые будут влиять на положение.Учтите, что если бы у вас были body другие элементы, кроме p, это не дало бы ожидаемых результатов.В этом случае вы можете сделать <xsl:apply-templates select="p" />, но это предполагает, что вы хотите игнорировать другие элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...