Как конвертировать тег XML с помощью xsl - PullRequest
0 голосов
/ 17 октября 2018

Мне нужно конвертировать xml с использованием файла xsl, вопрос в том, что у меня есть несколько тегов с одинаковыми именами, но с другим атрибутом, я должен конвертировать их, меняя свое имя с именем своего атрибута и печатая их значение.Вот пример:

<INDEX_FIELDS>
  <FIELD NAME= "Field1" VALUE= "value1"/>
  <FIELD NAME= "Field2" VALUE= "value2"/>
  <FIELD NAME= "Field3" VALUE= "value3"/>
  <FIELD NAME= "Field4" VALUE= "value4"/>
</INDEX_FIELDS>

Я хочу сделать это так:

<INDEX_FIELD>
  <FIELD1>VALUE1</FIELD1>
  <FIELD2>VALUE2</FIELD2>
  <FIELD3>VALUE3</FIELD3>
  <FIELD4>VALUE4</FIELD4>
</INDEX_FIELD>

Я мог бы использовать только преобразование xsl.Кто-нибудь может мне помочь?Я посетил сайт школы W3C, попробовал несколько методов, но, похоже, ничего не работает.Спасибо, кто ответит.

Вот мой xslt:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
  <ROOT>
   <HEAD>
    <TAG><xsl_value-of select="ROOT/HEAD/TAG"/></TAG>
     <-- Several tag -->
    </HEAD>
    <BODY>
    <DOCUMENTS><--Here it is a list of documents -->
    <xsl:for-each select="ROOT/BODY/DOCUMENTS/DOCUMENT">
    <DOCUMENT>
     <xsl:for-each select="INDEX_FIELDS/FIELD">
    enter code here
     </xsl:for-each>
    <-- Closing tags --> 

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Нет необходимости использовать циклы for-each.Вы также можете использовать xsl:template match правила, которые соответствуют одной части вашего XML-документа.Это правило будет выполняться при каждом совпадении в XML

Альтернативный способ структурирования вашего XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
  <ROOT>
   <HEAD>
    <TAG><xsl_value-of select="ROOT/HEAD/TAG"/></TAG>
     <-- Several tag -->
    </HEAD>
    <BODY>
    <DOCUMENTS>
        <xsl:apply-templates match="DOCUMENT"/>--this tells the XSLT processor to find all DOCUMENT nodes and process them. 
    <-- Closing tags --> 
....
<xsl:template match="DOCUMENT">
    <DOCUMENT>
        process your Document nodes here
        <xsl:apply-templates/> --this makes sure the subnodes in the DOCUMENT node are processed. 
    </DOCUMENT>
</xsl:template>
....
<xsl:template match="FIELD">
    <xsl:element name="{@NAME}">
        <xsl:value-of select="@VALUE"/>
    </xsl:element>
</xsl:template>

XSLT учебник: http://edutechwiki.unige.ch/en/XSLT_Tutorial_-_Basics#A_first_glance_at_XSLT

XSLT работает немного по-разному для многих языков программирования: вместо списка инструкций с подпрограммами и т. Д. Вы указываете список возможных узлов в исходном документе и что с ними делать.

0 голосов
/ 17 октября 2018
<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="FIELD">
        <xsl:element name="{@NAME}">
            <xsl:value-of select="@VALUE"/>
        </xsl:element>
    </xsl:template>
Try it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...