XSLT:获取相对 URI 而不是绝对 uri
XSLT: get relative URI instead of absolute uri
我想:
- 在我 运行 我的 XSLT 样式表所针对的同一文件夹中创建一个文件。
- 这个新文件有一个 href 列表,指向在 copyrholder 元素中具有特定值的文件。
- href 中有相对路径。
这是我目前拥有的:
- 我在同一文件夹中创建了一个新主题
- 具有绝对 uri 的 href 列表
问题:创建相对于我刚创建的文件的绝对路径。
例子
这是我正在引用的文件夹,所有文件都有我想要在列表中的特定元素:
C:/dita/file1.dita
C:/dita/file2.dita
C:/dita/file3.dita
C:/dita/file4.dita
C:/dita/en/file5.dita
这是我使用的 XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<xsl:result-document href="newtopic.dita" doctype-public="-//OASIS//DTD DITA Topic//EN" doctype-system="topic.dtd" indent="yes">
<topic id="to_new_topics">
<xsl:element name="title">New topics</xsl:element>
<xsl:element name="body">
<xsl:variable name="folderURI" select="resolve-uri('.',base-uri())"/>
<ul>
<xsl:for-each select="collection(concat($folderURI, '?select=*.dita;recurse=yes'))//copyrholder[contains(., 'value')]">
<li>
<xsl:element name="xref">
<xsl:attribute name="href">
<xsl:value-of select="base-uri()" />
</xsl:attribute>
</xsl:element>
</li>
</xsl:for-each>
</ul>
</xsl:element>
</topic>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
这是当前结果:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="to_new_topics">
<title>New topics</title>
<body>
<ul>
<li><xref href="file:/C:/´dita/file1.dita"/></li>
<li><xref href="file:/C:/´dita/file2.dita"/></li>
<li><xref href="file:/C:/´dita/file3.dita"/></li>
<li><xref href="file:/C:/´dita/file4.dita"/></li>
<li><xref href="file:/C:/dita/en/file5.dita"/></li>
</ul>
</body>
</topic>
这是我想要的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="to_new_topics">
<title>New topics</title>
<body>
<ul>
<li><xref href="file1.dita"/></li>
<li><xref href="file2.dita"/></li>
<li><xref href="file3.dita"/></li>
<li><xref href="file4.dita"/></li>
<li><xref href="en/file5.dita"/></li>
</ul>
</body>
</topic>
谁能帮我把路径设为相对路径?
这行得通吗:
<xsl:value-of select="replace(base-uri(), $folderURI, '') "/>
(在评论中没有看到这个),因为如果问题是外部参照的绝对路径,用空值替换路径应该可以解决这个问题。或者我只是理解了一些可怕的错误。 :) 这是我的测试最终结果:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="to_new_topics">
<title>New topics</title>
<body>
<ul>
<li>
<xref href="en/file3.dita"/>
</li>
<li>
<xref href="file1.dita"/>
</li>
<li>
<xref href="file2.dita"/>
</li>
</ul>
</body>
</topic>
测试:XSL,newtopic.xml(为避免出现问题并将其重命名为 .xml,而不是 .dita)并且所有 file*.dita 文件都在同一文件夹或子文件夹中。
我想:
- 在我 运行 我的 XSLT 样式表所针对的同一文件夹中创建一个文件。
- 这个新文件有一个 href 列表,指向在 copyrholder 元素中具有特定值的文件。
- href 中有相对路径。
这是我目前拥有的:
- 我在同一文件夹中创建了一个新主题
- 具有绝对 uri 的 href 列表
问题:创建相对于我刚创建的文件的绝对路径。
例子
这是我正在引用的文件夹,所有文件都有我想要在列表中的特定元素:
C:/dita/file1.dita
C:/dita/file2.dita
C:/dita/file3.dita
C:/dita/file4.dita
C:/dita/en/file5.dita
这是我使用的 XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<xsl:result-document href="newtopic.dita" doctype-public="-//OASIS//DTD DITA Topic//EN" doctype-system="topic.dtd" indent="yes">
<topic id="to_new_topics">
<xsl:element name="title">New topics</xsl:element>
<xsl:element name="body">
<xsl:variable name="folderURI" select="resolve-uri('.',base-uri())"/>
<ul>
<xsl:for-each select="collection(concat($folderURI, '?select=*.dita;recurse=yes'))//copyrholder[contains(., 'value')]">
<li>
<xsl:element name="xref">
<xsl:attribute name="href">
<xsl:value-of select="base-uri()" />
</xsl:attribute>
</xsl:element>
</li>
</xsl:for-each>
</ul>
</xsl:element>
</topic>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
这是当前结果:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="to_new_topics">
<title>New topics</title>
<body>
<ul>
<li><xref href="file:/C:/´dita/file1.dita"/></li>
<li><xref href="file:/C:/´dita/file2.dita"/></li>
<li><xref href="file:/C:/´dita/file3.dita"/></li>
<li><xref href="file:/C:/´dita/file4.dita"/></li>
<li><xref href="file:/C:/dita/en/file5.dita"/></li>
</ul>
</body>
</topic>
这是我想要的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="to_new_topics">
<title>New topics</title>
<body>
<ul>
<li><xref href="file1.dita"/></li>
<li><xref href="file2.dita"/></li>
<li><xref href="file3.dita"/></li>
<li><xref href="file4.dita"/></li>
<li><xref href="en/file5.dita"/></li>
</ul>
</body>
</topic>
谁能帮我把路径设为相对路径?
这行得通吗:
<xsl:value-of select="replace(base-uri(), $folderURI, '') "/>
(在评论中没有看到这个),因为如果问题是外部参照的绝对路径,用空值替换路径应该可以解决这个问题。或者我只是理解了一些可怕的错误。 :) 这是我的测试最终结果:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE topic
PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">
<topic id="to_new_topics">
<title>New topics</title>
<body>
<ul>
<li>
<xref href="en/file3.dita"/>
</li>
<li>
<xref href="file1.dita"/>
</li>
<li>
<xref href="file2.dita"/>
</li>
</ul>
</body>
</topic>
测试:XSL,newtopic.xml(为避免出现问题并将其重命名为 .xml,而不是 .dita)并且所有 file*.dita 文件都在同一文件夹或子文件夹中。