разделить различные атрибуты элемента на несколько повторяющихся строк - PullRequest
0 голосов
/ 14 сентября 2018

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

Ввод:

<ROOT>
<Data X="1233" Y="1:30:57" Z="abcd"/>
<Info T="1:30:57" F="xyz" H="1234" "/>

Исключено Выход:

<ROOT>
    <Data X="1233"/>
    <Data Y="1:30:57"/>
    <Data Z="abcd"/>
    <Info T="1:30:57 />
    <Info F="xyz" />
    <Info H="1234"/>    

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Решением вашей проблемы является следующая таблица стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <xsl:template match="/ROOT">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Data | Info">
    <xsl:variable name="nod" select="local-name()" />
    <xsl:for-each select="@*">
        <xsl:element name="{$nod}">
            <xsl:attribute name="{local-name()}">
                <xsl:value-of select="." />
            </xsl:attribute>
        </xsl:element>
    </xsl:for-each>
  </xsl:template>  

</xsl:stylesheet>

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <Data X="1233"/>
    <Data Y="1:30:57"/>
    <Data Z="abcd"/>
    <Info T="1:30:57"/>
    <Info F="xyz"/>
    <Info H="1234"/>
</ROOT>
0 голосов
/ 15 сентября 2018

Если вы правильно отформатировали ввод

<document>
    <ROOT>
        <Data X="1233" Y="1:30:57" Z="abcd"/>
        <Info T="1:30:57" F="xyz" H="1234"/>
    </ROOT>
</document>

Это должно сделать это

<xsl:template match="Data | Info">
    <xsl:for-each select="./@*">
        <xsl:element name="{name(./parent::node())}">
            <xsl:attribute name="{local-name()}">
                <xsl:value-of select="." />                
            </xsl:attribute>
        </xsl:element>
    </xsl:for-each>
</xsl:template>
0 голосов
/ 15 сентября 2018

Ваши данные на самом деле не правильно сформированы, то есть ваши атрибуты не отформатированы должным образом.

<ROOT>
    <Data "X=1233,Y=1:30:57,Z=abcd"/>
    <Info " T=1:30:57,F=xyz,H=1234 "/>
</ROOT>

Должно быть действительно

<ROOT>
    <Data X="1233" Y="1:30:57" Z="abcd"/>
    <Info T="1:30:57" F="xyz" H="1234"/>
</ROOT>

Если вы должны работать с тем, что у вас естьВозможно, вы сможете что-то сделать с xsl: analysis-string, но я сомневаюсь в этом, потому что данные не являются правильно сформированным XML. Я не думаю, что вы сможете анализировать атрибуты такими, какие они есть.

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