Как добавить PlayOrder Sequence в pageTarget с помощью XSLT? - PullRequest
0 голосов
/ 30 апреля 2018

Атрибут playOrder необходим для каждой цели страницы и navPoint. Он предоставляет средство для сопоставления всех pageTargets и navPoints в одну упорядоченную последовательность, которая отражает их порядок в последовательности обычного воспроизведения книги, представленной в файлах spine. playOrder должен увеличиться на единицу и продолжить с NavPoint.

Ввод:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
    <head>
        <meta name="dtb:uid" content="urn:uuid:29d919dd-24f5-4384-be78-b447c9dc299b"/>
    </head>
    <docTitle>
        <text></text>
    </docTitle>
    <navMap>
        <navPoint id="navpoint1" playOrder="1">
            <navLabel>
                <text>Chapter 1</text>
            </navLabel>
            <content src="ch1.xhtml"/>
        </navPoint>
        <navPoint id="navpoint2" playOrder="2">
            <navLabel>
                <text>Chapter 2</text>
            </navLabel>
            <content src="ch2.xhtml"/>
        </navPoint>
</navMap>

    <pageList id="page-mapping" class="page-mapping">
        <navLabel><text>Page Mapping</text></navLabel>
        <pageTarget id="page1" value="1" type="normal"><navLabel><text>1</text></navLabel><content src="ch1.xhtml#pg1" /></pageTarget>
        <pageTarget id="page2" value="2" type="normal"><navLabel><text>2</text></navLabel><content src="ch2.xhtml#pg2" /></pageTarget>
    </pageList>
</ncx>

Ожидаемый вывод:

        <navPoint id="navpoint2" playOrder="2">
            <navLabel>
                <text>Chapter 2</text>
            </navLabel>
            <content src="ch2.xhtml"/>
        </navPoint>
</navMap>

    <pageList id="page-mapping" class="page-mapping">
        <navLabel><text>Page Mapping</text></navLabel>
        <pageTarget id="page1" value="1" type="normal" playOrder="3"><navLabel><text>1</text></navLabel><content src="ch1.xhtml#pg1" /></pageTarget>
        <pageTarget id="page2" value="2" type="normal" playOrder="4"><navLabel><text>2</text></navLabel><content src="ch2.xhtml#pg2" /></pageTarget>
    </pageList>
</ncx>

В этом случае, как кодировать на XSLT .. Пожалуйста, сообщите мне. Спасибо

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете использовать <xsl:number count="navPoint | pageTarget" level="any"/>, чтобы определить число, а затем создать атрибут для этого элемента:

  <xsl:template match="pageTarget">
      <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:attribute name="playOrder">
              <xsl:number count="navPoint | pageTarget" level="any"/>
          </xsl:attribute>
          <xsl:apply-templates/>
      </xsl:copy>
  </xsl:template>

Остальное может быть обработано преобразованием идентичности, см. Онлайн-пример в XSLT 3 по адресу

https://xsltfiddle.liberty -development.net / 6qVRKvV / 1

что делает

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xpath-default-namespace="http://www.daisy.org/z3986/2005/ncx/"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="pageTarget">
      <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:attribute name="playOrder">
              <xsl:number count="navPoint | pageTarget" level="any"/>
          </xsl:attribute>
          <xsl:apply-templates/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 30 апреля 2018

Поскольку ваш исходный XML имеет пространство имен по умолчанию (http://www.daisy.org/z3986/2005/ncx/),, мы объявим его в таблице стилей как:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ncx="http://www.daisy.org/z3986/2005/ncx/"
    version="1.0">

затем мы подсчитываем количество navPoint узлов и сохраняем их в переменной

<xsl:variable name="navPointCount" select="count(//ncx:navPoint)"/>

и у нас есть шаблон идентификации для копирования всех узлов

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy> 
</xsl:template>

затем мы сопоставляем целевой узел pageTarget, теперь он становится ncx:pageTarget, чтобы сказать, что это pageTarget узел в пространстве имен ncx

<xsl:template match="ncx:pageTarget">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <!-- here, playOrder attribute is being inserted -->
        <xsl:attribute name="playOrder">
            <xsl:value-of select="count(preceding-sibling::ncx:pageTarget) + $navPointCount + 1"/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

вся таблица стилей теперь становится:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ncx="http://www.daisy.org/z3986/2005/ncx/"
    version="1.0">

    <xsl:variable name="navPointCount" select="count(//ncx:navPoint)"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy> 
    </xsl:template>

    <xsl:template match="ncx:pageTarget">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="playOrder">
                <xsl:value-of select="count(preceding-sibling::ncx:pageTarget) + $navPointCount + 1"/>
            </xsl:attribute>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

увидеть это в действии здесь .

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