如何获得XSL文件目录的绝对路径

本文关键字:路径 文件目录 何获得 XSL | 更新日期: 2023-09-27 18:21:55

我的Schema.xsd文件与.xsl文件位于同一目录中。在.xsl文件中,我想在生成的输出中生成一个指向Schema.xsl的链接。生成的输出位于不同的目录中。目前我是这样做的:

   <xsl:template match="/">
     <root version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:noNamespaceSchemaLocation="../../../Schema.xsd">
     <!-- . . . -->

然而,这迫使生成的输出位于Schema.xsd目录下的3个级别。我想在输出中生成一个到模式的绝对路径,这样输出就可以位于任何地方。

更新我使用XSLT 1.0(.NET Framework 4.5中的XslCompiledTransform实现)。

如何获得XSL文件目录的绝对路径

XSLT 2.0解决方案

使用XPath 2.0函数resolve-uri():

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"
              omit-xml-declaration="yes"
              encoding="UTF-8"/>
  <xsl:template match="/">
    <root version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="{concat(resolve-uri('.'), 'Schema.xsd')}">
    </root>
  </xsl:template>
</xsl:stylesheet>

收益率,无需参数传递,与输入XML无关:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      version="1.0"
      xsi:noNamespaceSchemaLocation="file:/c:/path/to/XSLT/file/Schema.xsd"/>

这是一个如何实现的草图(另请参阅通过.NET将参数传递到XSLT样式表)

在C#代码中,您需要定义并使用一个参数列表:

XsltArgumentList argsList = new XsltArgumentList();
argsList.AddParam("SchemaLocation","","<SOME_PATH_TO_XSD_FILE>");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("<SOME_PATH_TO_XSLT_FILE>");
using (StreamWriter sw = new StreamWriter("<SOME_PATH_TO_OUTPUT_XML>"))
{
    transform.Transform("<SOME_PATH_TO_INPUT_XML>", argsList, sw);
} 

您的XSLT可以这样增强:

...
<xsl:param name="SchemaLocation"/> <!-- this more or less at the top of your XSLT! -->
...
<xsl:template match="/">
   <root version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="{$SchemaLocation}">
   ...
   ...
</xsl:template>
....