Я пытаюсь создать выходной 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>
Помогло бы нам понять, чего вы пытаетесь достичь, если бы вы могли разместить образец ввода и ожидаемый результат. –
Я обновил сообщение. Надеемся, что помощь ввода, вывода и перефразирования. –
Ваш «текущий код», похоже, вообще не связан с вопросом. –