Ответ, который я отправил в ответ на ваш предыдущий вопрос: https://xsltfiddle.liberty-development.net/bwe3c5/1 и имеет код
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
</xsl:template>
<xsl:template match="td">
<xsl:param name="pos" select="position()"/>
<xsl:value-of select="., '{', ../following-sibling::tr[1]/td[$pos + 1], '}'" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Если вы запускаете Saxon из командной строки, вы можете просто использовать -o:file.text
для определенного имени выходного файла; если вам нужно сделать это в коде XSLT, тогда используйте
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:result-document href="file.text">
<xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
</xsl:result-document>
</xsl:template>
<xsl:template match="td">
<xsl:param name="pos" select="position()"/>
<xsl:value-of select="., '{', ../following-sibling::tr[1]/td[$pos + 1], '}'" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
Что касается того, что Saxon не дает вам никаких ошибок, вы не сказали нам, как вы пытаетесь использовать его точно и какую версию точно.
Я думаю, что для вашего примера по какой-то причине вы переместили выделение <xsl:apply-templates select="html/body/table/tr[1]/td[position() > 1 and position() < 6]"/>
, которое я сделал в контексте match="/"
, в другой шаблон с другим шаблоном соответствия, а затем добавили for-each
в В дальнейшем меняем контекст, просто я не ожидаю, что какой-либо документ HTML будет содержать другой в ячейке таблицы, поэтому относительный путь, начинающийся с html
, когда ваш контекст - ячейка таблицы, вряд ли что-либо выберет.
Если в вашей таблице больше строк, и вы хотите отобразить каждую, но первую строку, в файл, то я думаю, что лучше обрабатывать эти строки в отдельном режиме, который создает файл результатов и изменяет логи c в другой шаблон для извлечения имен функций из первой строки:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="html/body/table/tr[position() > 1]" mode="file"/>
</xsl:template>
<xsl:template match="td">
<xsl:param name="pos" select="position()"/>
<xsl:value-of select="../../tr[1]/td[$pos + 1], '{', ., '}'" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="tr" mode="file">
<xsl:result-document href="{td[1]}.cpp">
<xsl:apply-templates select="td[position() > 1 and position() < 6]"/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
Что касается онлайн-скрипки, извините, но он не настроен на поддержку xsl:result-document
, так как, с одной стороны, Saxon с настройки безопасности, необходимые на сервере publi c, отключают эту инструкцию, и, как с другой стороны, скрипка служит площадкой XSLT 1 - 3, в настоящее время не интеграция любых функций для создания и отображения более одного результата.