首页 > 解决方案 > 如何使用 XSLT 在 toc.ncx 中添加 playOrder?

问题描述

如果我决定在 navmap 中现有 toc.ncx 的开头添加一个 navpoint 元素,则无法重新排序 playOrder 编号,只能手动重新排序。如果有很多导航点元素,那可能真的很乏味。

输入

 <?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>

此代码不起作用,您能告诉我正确的代码吗

标签: xslt

解决方案


用这个:

<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上的转换


推荐阅读