2015-01-07 1 views
-1

Я пытаюсь создать выходной XML-файл из входного XML-файла. Некоторые из узлов необходимо скопировать из ввода в вывод, некоторые из них будут опущены, а некоторые из узлов будут иметь свой текст в некотором роде. Однако в дополнение к этому мне нужно обрезать пробелы из текста каждого узла. Я предполагаю, что лучший способ сделать это - иметь два шаблона, вызываемых в одном наборе узлов, используя режим или какой-либо другой атрибут, но я не могу понять, как это сделать. Слишком много узлов, чтобы вручную применить trim() к каждому узлу.Как применить два шаблона к одному набору узлов, особенно ко всем узлам в XML

Код для удаления пробелов работает сам по себе (решение другого Stackoverflow), но я не знаю, как изменить XML с помощью другого шаблона, а затем применить эти два шаблона. Я ожидаю, что решение будет что-то вроде:

<xsl:template match="/"> 

сделать преобразование работы ...

прыжка, чтобы соответствовать = "узлу()" шаблон

</xsl:template> 

Удалить пробельное решение:

<xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:value-of select="normalize-space(.)" /> 
</xsl:template> 

Образец ввода:

<ABC Id="64" Author="FirstName"> 
    <Note Type="Test" ID="01"> 
     <Note.1>string  </Note.1> 
     <Note.2> 
      <Point.1>string2  </Point.1> 
      <Point.2>hello</Point.2> 
     </Note.2> 
    </Note> 
</ABC> 

Ожидаемые результаты:

<ABC Id="64" Author="FirstName"> 
    <Note Type="Test" ID="01"> 
     <Note.1>STRING</Note.1> 
     <Note.2> 
     <Point.1>string2</Point.1> 
     </Note.2> 
    </Note> 
</ABC> 

Note.1 был скопирован из источника, преобразуется в верхний регистр и были удалены пробелы. Note.2/Point.1 удалены пробелы. Примечание.2/Точка 2 не была скопирована из источника.

Редактировать --- Мой текущий код. Он правильно удаляет пробелы. Однако полученный XML содержит каждый узел из источника с удаленным пробелом, а не только те узлы, которые копируются в первом преобразовании. Я сохраняю эти узлы в переменной, а затем передаю эту переменную в мой шаблон удаления пробелов. Любые мысли о том, почему шаблон удаления пробелов действует на исходный набор вместо набора, содержащегося в переменной?

<xsl:template match="/"> 
    <!--Store the results in a variable called transformation_result--> 
    <xsl:variable name="transformation_result"> 
     <!--Go to the normal transformation template --> 
     <xsl:call-template name="transformation"/> 
    <!--Results now in $transformation_result --> 
    </xsl:variable>  
    <!-- If you want to see what is in the variable --> 
    <!--<xsl:copy-of select="$transformation_result"/>--> 
    <!-- Go to the template that copies all input --> 
    <xsl:call-template name="copy_for_whitespace"> 
     <!-- The $tranformation_result is the parameter passed in by the name of: input --> 
     <xsl:with-param name="input" select="$transformation_result"/> 
    </xsl:call-template> 
    </xsl:template> 
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
    <xsl:template name="transformation"> 
    <imp1:HIJ> 
     <xsl:copy-of select="/imp1:HIJ/imp1:ABC"> 
     <?oracle-xsl-mapper-position imp1:ABC?> 
     </xsl:copy-of> 
    </imp1:HIJ> 
    </xsl:template> 
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
    <xsl:template name="copy_for_whitespace" match="node()">   
    <xsl:param name="input"/> 
    <xsl:variable name="test"> 
    <xsl:copy>             
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
     </xsl:variable> 
    <xsl:copy-of select="$test"/> 
    </xsl:template> 
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
    <xsl:template match="text()">          
    <xsl:value-of select="normalize-space()"/> 
    </xsl:template> 
+3

Помогло бы нам понять, чего вы пытаетесь достичь, если бы вы могли разместить образец ввода и ожидаемый результат. –

+0

Я обновил сообщение. Надеемся, что помощь ввода, вывода и перефразирования. –

+0

Ваш «текущий код», похоже, вообще не связан с вопросом. –

ответ

1

Это не совсем ответ, но слишком длинный комментарий.

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

(a) Преобразование в два прохода: применить первый набор шаблонов к исходным узлам исходного документа, в то время как передача результата в переменную; затем примените второй набор шаблонов к (новым) узлам в переменной, на этот раз направляя результат на вывод.

(b) Объедините два преобразования в один: к сожалению, вы не показали нам шаблоны для первого преобразования (именно поэтому это не может быть ответом), но в качестве примера, если вы хотите переместить узел текст в верхнем регистре и обрезать пробела, вы можете сделать просто:

<xsl:template match="Note.1"> 
    <xsl:copy> 
     <xsl:value-of select="normalize-space(upper-case(.))"/> 
    </xsl:copy> 
</xsl:template> 

Если нормализации пробельного всеми ваше второе преобразование должно делать, то я считаю вариант (б) был бы лучшим выбором.

+0

Спасибо! Это немного помогло мне. Мне нужно сделать ваше предложение вместо b, потому что слишком много узлов для применения функции по отдельности. –

+0

Я не был бы слишком уверен в этом. –

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