Как добавить playOrder в toc.ncx с помощью XSLT? - PullRequest
0 голосов
/ 26 апреля 2018

Если я решу добавить элемент navpoint в toc.ncx в начале существующего toc.ncx в navmap, я не могу изменить порядок номера playOrder, кроме как вручную. Это может быть очень утомительно, если есть много элементов navpoint.

Введите

 <?xml version="1.0" encoding="UTF-8"?>
<ncx version="2005-1" xmlns="http://www.daisy.org/z3986/2005/ncx/">
  <head>
    <meta name="dtb:uid" content="9781315348674" />
    <meta name="dtb:depth" content="1" />
    <meta name="dtb:totalPageCount" content="144" />
    <meta name="dtb:maxPageNumber" content="144" />
  </head>
  <docTitle>
    <text>Making Choices for Health Care</text>
  </docTitle>
  <navMap>
<navPoint id="nav-1">
<navLabel>
<text>Cover</text>
</navLabel>
<content src="xhtml/A01_cover.xhtml"/>
</navPoint>
<navPoint id="nav-2">
<navLabel>
<text>Half Title</text>
</navLabel>
<content src="xhtml/A02_halftitle.xhtml"/>
</navPoint>
</navMap>
</ncx>

Предполагая вывод как:

<navPoint id="nav-1" playOrder="1">
      <navLabel>
        <text>1</text>
      </navLabel>
      <content src="Text/Section0002.xhtml"/>
    </navPoint>
    <navPoint id="nav-2" playOrder="2">
      <navLabel>
        <text>2</text>
      </navLabel>
      <content src="Text/Section0003.xhtml"/>
    </navPoint>

XSLT код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <!-- Recursive copy template -->    
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
<xsl:template match="navPoint">
  <xsl:copy>
    <xsl:attribute name="playOrder">1</xsl:attribute>
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>
    <xsl:template match="@playOrder">
        <xsl:attribute name="playOrder"><xsl:number count="*[@playOrder]" level="any"/></xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

Этот код не работает, и можете ли вы сказать мне правильный код

Ответы [ 2 ]

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

Если вы просто хотите нормальную нумерацию 1,2,3, вы можете count() предшествовать узлам.

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

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

    <xsl:template match="navPoint">
      <xsl:copy>
        <xsl:attribute name="playOrder">
          <xsl:value-of select="count(preceding-sibling::navPoint) + 1" />
        </xsl:attribute>
        <xsl:apply-templates />
      </xsl:copy>
    </xsl:template>

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

Используйте это:

<xsl:attribute name="playOrder"><xsl:number count="navPoint" level="any"/>/xsl:attribute>

вместо

<xsl:attribute name="playOrder">1</xsl:attribute>

и удалить шаблон

   <xsl:template match="@playOrder">
    <xsl:attribute name="playOrder"><xsl:number count="*[@playOrder]" level="any"/></xsl:attribute>
</xsl:template>

См. Преобразование в https://xsltfiddle.liberty -development.net / 94hvTyV / 2

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