使用generate-id()获取xsl:result-document filename并链接到HTML

时间:2015-12-05 19:44:53

标签: html xml xslt xslt-1.0 saxon

我正在使用xslt将一个大的xml转换为更小的互连html文件。我有使用generate-id()函数的麻烦,因为生成的id对于html href =“”和文件名中的id是不一样的

我通过xsl创建以下文件:result-document:

  

index.html | d1e83523.html | d1e83524.html | d1e83525.html | ...

index.html应该包含一个列表,其中包含指向其他* .html文件的链接

我想要的

index.html ,但我得到的只是不同的ID:

      <ul>
         <li><a href="d1e83523.html">Sample 1</a></li>
         <li><a href="d1e83524.html">Sample 2</a></li>
         <li><a href="d1e83525.html">Sample 3</a></li>
      </ul>

xsl 创建 index.html

<xsl:template match="lab/*">
    <xsl:result-document encoding="utf-8" method="html" href="HTML_out/index.html" >
                <html>
                    <head></head>
                    <body>
                        <ul>
                            <xsl:for-each select="chapter/heading">
                                <li>
                                    <a href="{generate-id()}.html">
                                        <xsl:value-of select="foo"/>
                                    </a>
                                </li>
                            </xsl:for-each>
                        </ul>
                    </body>
                </html>
            </xsl:result-document>
 </xsl:template>

xsl 创建其他 * .html

<xsl:template match="chapter/*[not(self::heading)]">
        <xsl:for-each select=".">
            <xsl:result-document encoding="utf-8" method="html" href="HTML_out/{concat(generate-id(), '.html')}" >
                <html>
                    <head></head>
                    <body>
                        <xsl:apply-templates/>
                    </body>
                </html>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>

xml-sample (注意:跟随多个 description -like-structured元素)

<lab>
    <description>
        <chapter>
            <heading>Example</heading
            <operation>other elements</operation>
            <operation>other elements</operation>
            ...
        </chapter>
        ...
    </description>
</lab>

我很感激每一个帮助!

编辑:我正在使用generate-id()为这些文件获取唯一的文件名

1 个答案:

答案 0 :(得分:1)

如果将<xsl:for-each select="chapter/heading">更改为<xsl:for-each select="chapter/*[not(self::heading)]">,则索引生成将处理生成结果文档的相同元素,并且生成的ID应匹配。但是,您需要在同一转换中运行两个XSLT片段以确保获得相同的ID,如果您有单独的样式表,那么generate-id不能保证给出相同的结果。