Преобразование XML в XML с помощью XSLT - PullRequest
0 голосов
/ 06 марта 2019

Я новичок в XSLT и хочу преобразовать XML в другой XML. Необходимый формат ввода и вывода указан ниже,

Входной XML

<record>
<fields>
<fieldname>"Name"</fieldname>
<fieldvalue>"ABCD"</fieldvalue>
<fieldname>"Age"</fieldname>
<fieldvalue>"22"</fieldvalue>
<fieldname>"Country"</fieldname>
<fieldvalue>"India"</fieldvalue>
</fields>
</record>

Требуемый выходной XML,

<record>
<Name>"ABCD"</Name>
<Age>"22"</Age>
<Country>"India"</Country>
</record>

fieldname является постоянным, тогда как fieldvalue является динамическим. Как это можно реализовать с помощью XSLT.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Решение, предоставленное Вебби , работает из-за странных характеристик xsl:value-of в XSLT 1.0 , а именно, даже если выражение XPath вернуло несколько узлов,значение для вывода берется только из первого узла.

Это решение не будет работать в XSLT 2.0 , где xsl:value-of выводит значения все найдены узлы.

Чтобы скрипт мог выводить только first после родственного брата, выражение XPath должно быть дополнено [1] (работает также в XSLT 1.0 ).

Еще одна деталь заключается в том, что в версии 2.0 replace поддерживается функция, поэтому вам не нужно StringUtils пространство имен.

Так что, если вы можете использовать версию 2.0 , мое предложение:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="record/fields">
    <record>
      <xsl:for-each select="fieldname">
        <xsl:variable name="fieldName" select="replace(.,'&quot;','')"/>
        <xsl:element name="{$fieldName}">
          <xsl:value-of select="following-sibling::fieldvalue[1]"/>
        </xsl:element>
      </xsl:for-each>
    </record>
  </xsl:template>
</xsl:stylesheet>

Рабочий пример см. http://xsltransform.net/nbiCsZa

Редактировать

Дажев XSLT 1.0 в этом случае вы можете обойтись без StringUtils пространства имен.Вместо str:replace, вы можете позвонить translate (поддерживается в версии 1.0 ), поэтому соответствующую инструкцию следует изменить на:

<xsl:variable name="fieldName" select="translate(.,'&quot;','')"/>
0 голосов
/ 06 марта 2019

Если вы используете XSLT 1.0 , то это может быть достигнуто следующим образом:

Примечание: Здесь replace() из org.apache.commons.lang.StringUtils используется для удаления кавычек, появляющихся в <fieldname>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:str="xalan://org.apache.commons.lang.StringUtils"
exclude-result-prefixes="str">

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

<xsl:template match="record/fields">
    <record>
        <xsl:for-each select="fieldname">
            <xsl:variable name="fieldName" select="str:replace(.,'&quot;','')" />
            <xsl:element name="{$fieldName}">
                <xsl:value-of select="following-sibling::fieldvalue" />
            </xsl:element>
        </xsl:for-each>
    </record>
</xsl:template>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...