2015-07-06 2 views
0

У меня есть несколько тысяч xsl-файлов, и мне нужно их преобразовать, чтобы индексировать их в Solr. Я сделал это, но мне нужен каждый файл, чтобы иметь идентификатор поля, такой же, как имя файла. файлы выглядеть следующим образом:Преобразование xsl в xml, добавляющее не существующее поле?

<TEXT>&#2; 
<TITLE>A Title</TITLE> 
<DATELINE> A Dateline </DATELINE> 
<BODY> text </BODY> 
</TEXT> 

Например: имена мои файлы, как "0001.xsl", "0002.xsl" .. и т.д.. мне нужно иметь что-то вроде:

<?xml version="1.0" encoding="UTF-8"?> 
<add> 
    <doc> 
     <field name="ID">0001</field> 
     <field name="TITLE">-a tile-</field> 
     <field name="DATELINE">-a dateline-</field> 
     <field name="BODY"> -text-</field> 
</field> 
    </doc> 
</add> 

Это таблица стилей:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <!-- use this for debugging only --> 
    <!-- <xsl:output method="xml" indent="yes"/> --> 

    <xsl:template match="*"> 
    <xsl:element name="field"> 
     <xsl:attribute name="name"> 
     <xsl:value-of select="name()"/> 
     </xsl:attribute> 
     <xsl:value-of select="."/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="/"> 
    <add> 
     <doc>   
     <xsl:apply-templates select="//TEXT/*"/> 
     </doc> 
    </add> 
    </xsl:template> 

</xsl:stylesheet> 

Как именно я могу это сделать? Нужно ли мне менять стили или я могу использовать Java для добавления определенного поля после того, как я прочитал имя файла? Я использую Java для преобразования файлов и их индексирования.

+0

вы можете передать имя файла в качестве параметра в таблице стилей? Или переключиться на процессор XSLT 2.0? –

ответ

1

Поскольку вы используете Java, вы можете переключиться на Saxon и XSLT 2.0, где у вас есть функции для считывания URI документа и tokenize, чтобы разделить его на извлечение имени файла. Или с процессором XSLT 1.0, предполагая, что вы выполняете преобразование с помощью Java-кода, который все равно знает имя файла, чтобы запустить преобразование на нем, вы можете рассмотреть возможность определения глобального параметра, который ваш код Java устанавливает в имя файла перед запуском преобразования и что XSLT считывает:

<xsl:param name="file-id"/> 

    <xsl:template match="/"> 
    <add> 
     <doc> 
     <field name="ID"><xsl:value-of select="$file-id"/></field>  
     <xsl:apply-templates select="//TEXT/*"/> 
     </doc> 
    </add> 
    </xsl:template> 

Обратите внимание, что ваш другой шаблон довольно многословен, он может быть сокращен до

<xsl:template match="*"> 
    <field name="{name()}"> 
     <xsl:value-of select="."/> 
    </field> 
    </xsl:template> 
+0

спасибо за ваш ответ :). Я совершенно новичок во всем этом, поэтому мне нужно все больше изучить и понять. Я буду смотреть на саксон, так как я тоже имел это в виду. –

Смежные вопросы