xsl: для каждого файла в каталоге (общее решение) - PullRequest
0 голосов
/ 26 июля 2010

Я нашел решение для subj, связанного с процессором Visual Studio XSLT:

   public class XsltListFilesExtension
    {
        public XPathNodeIterator ListFiles(string directoryPath)
        {
            XmlDocument doc = new XmlDocument();
            doc.AppendChild(doc.CreateElement("files"));

            DirectoryInfo di = new DirectoryInfo(directoryPath);
            foreach (FileInfo fi in di.GetFiles())
            {
                XmlElement file = doc.CreateElement("file");
                file.SetAttribute("name", fi.Name);
                file.SetAttribute("size", fi.Length.ToString());
                doc.DocumentElement.AppendChild(file);
            }
            return doc.DocumentElement.CreateNavigator().SelectChildren("file", "");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            XslTransform t = new XslTransform();
            t.Load("transform.xslt");

            XsltArgumentList xsltArgs = new XsltArgumentList();
            xsltArgs.AddExtensionObject("urn:list-files-extension", new XsltListFilesExtension());

            XPathDocument input = new XPathDocument("input.xml");
            using (FileStream output = new FileStream("output.txt", FileMode.Create))
            {
                t.Transform(input, xsltArgs, output);
            }
        }
    }

XSLT trasform.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    xmlns:lfe="urn:list-files-extension">
    <xsl:output method="text" indent="yes"/>

    <xsl:template match="/">
        <xsl:for-each select="lfe:ListFiles('D:\temp')">
            <xsl:value-of select="@name"/>
            <xsl:text> - </xsl:text>
            <xsl:value-of select="@size"/>
            <xsl:text>bytes
</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Могу ли я сделать решение, подобное этому, но для общей области, например: тот же самый файл xslt может выполняться с использованием процессора java xslt, C # и т. Д.? Спасибо.

Ответы [ 2 ]

1 голос
/ 26 июля 2010

Механизм extension является общим и является частью спецификации xslt.

Вам потребуется выяснить с любым процессором xsl, который вы используете, каков точный механизм и как импортировать его в лист xslt, но в целом подход похож.

Это возможно с java , и опубликованный вами пример уже находится на C #. Это должно быть возможно с любым процессором xslt, который поддерживает расширения xslt.

0 голосов
/ 26 июля 2010

Нет, я так не думаю. lfe: ListFiles ('D: \ temp') не является стандартным выражением Xpath. Это зависит от используемого вами XSLT-процессора. В Java вы должны импортировать библиотеку для процессора, который поддерживает это. Вы можете определить его как библиотеку по умолчанию.

Если вы хотите написать стандартные xsl-файлы, загрузите Xalan или Saxon XSLT и выполните преобразование с их помощью.

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