2010-06-30 8 views
0

Я все еще новичок в XSLT, но у меня сложная задача.Комплекс XSL Transformation

У меня есть файл, отличный от xml, который необходимо преобразовать. Формат файла является s следующим образом:

type1 
type1line1 
type1line2 
type1line3 
type2 
type2line1 
type2line2 
type3 
type3line1 
type3line2 

типов (type1, type2, ...) задаются с помощью определенных кодов, которые не имеют определенный порядок. Каждый тип имеет несколько line внизу.

Итак, мне нужно преобразовать этот файл, но проблема в том, что для каждого type мне нужно сделать другое преобразование для каждой из его основных линий.

Теперь я могу прочитать строку за строкой и определить, что начался новый тип, но я не знаю, как установить флаг (указывающий тип), чтобы использовать его в базовых строках.

Вот что я прямо сейчас:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> 
    <xsl:param name="testString" as="xs:string"> 
    type1 
    line1 
    line2 
    type1 
    line1 
    </xsl:param> 
    <xsl:template match="/"> 
    <xsl:call-template name="main"> 
     <xsl:with-param name="testString" select="$testString"/> 
    </xsl:call-template> 
    </xsl:template> 

    <xsl:template name="main"> 
    <xsl:param name="testString"/> 
    <xsl:variable name="iniFile" select="$testString"/> 
    <config> 
     <xsl:analyze-string select="$iniFile" regex="\n"> 
     <xsl:non-matching-substring> 
      <item> 
      <xsl:choose> 
       <xsl:when test="starts-with(., 'type1')"> 
    <!-- do a specific transformation-->  
       </xsl:when> 
       <xsl:when test="starts-with(., 'type2')"> 
    <!-- do another transformation-->  
       </xsl:when> 
      </xsl:choose> 
      </item> 
     </xsl:non-matching-substring> 
     </xsl:analyze-string> 
    </config> 
    </xsl:template> 
</xsl:stylesheet> 

Любая идея о том, как решить эту проблему.

+1

Вы понимаете, что XSLT предназначен для преобразования ** XML-файлов **? ;) –

+1

Отметьте этот вопрос как XSLT2, чтобы избежать комментариев, таких как Niels. @Niels van der Rest: XSLT2 может манипулировать непроверенными документами. – 2010-06-30 13:28:57

+0

@Alejandro Спасибо за исправление меня, я не знал об этом :) –

ответ

0

Я думаю, что XSLT 2.1 позволит вам использовать свои мощные средства, такие как для каждой группы, для последовательностей атомных значений, таких как строки, но с XSLT 2.0 у вас есть такие мощные функции только для последовательностей узлов, поэтому мой первый шаг при использовании XSLT 2.0 с данными простой строки. Я хочу, чтобы процесс/группа создавал элементы. Таким образом, вы можете подделать свои данные, перенести каждый токен на какой-то элемент и затем использовать для каждой группы группу-начинать с того, чтобы обрабатывать каждую группу, начиная с некоторого шаблона типа^type [0-9] + $ '. Вы на самом деле не сказали нам, что вы хотите с данными, как только вы определили группу так взять следующий пример можно адаптировать:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:param name="input" as="xs:string">type1 
type1line1 
type1line2 
type1line3 
type2 
type2line1 
type2line2 
type3 
type3line1 
type3line2</xsl:param> 

    <xsl:template name="main"> 
    <xsl:variable name="lines" as="element(item)*"> 
     <xsl:for-each select="tokenize($input, '\n')"> 
     <item><xsl:value-of select="."/></item> 
     </xsl:for-each> 
    </xsl:variable> 
    <xsl:for-each-group select="$lines" group-starting-with="item[matches(., '^type[0-9]+$')]"> 
     <xsl:choose> 
     <xsl:when test=". = 'type1'"> 
      <xsl:apply-templates select="current-group() except ." mode="m1"/> 
     </xsl:when> 
     <xsl:when test=". = 'type2'"> 
      <xsl:apply-templates select="current-group() except ." mode="m2"/> 
     </xsl:when> 
     <xsl:when test=". = 'type3'"> 
      <xsl:apply-templates select="current-group() except ." mode="m3"/> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="item" mode="m1"> 
    <foo> 
     <xsl:value-of select="."/> 
    </foo> 
    </xsl:template> 

    <xsl:template match="item" mode="m2"> 
    <bar> 
     <xsl:value-of select="."/> 
    </bar> 
    </xsl:template> 

    <xsl:template match="item" mode="m3"> 
    <baz> 
     <xsl:value-of select="."/> 
    </baz> 
    </xsl:template> 

</xsl:stylesheet> 

При применении с саксонскими опций 9 (командной строки -It : main -xsl: sheet.xsl), результат

<foo>type1line1</foo> 
<foo>type1line2</foo> 
<foo>type1line3</foo> 
<bar>type2line1</bar> 
<bar>type2line2</bar> 
<baz>type3line1</baz> 
<baz>type3line2</baz> 
Смежные вопросы