Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 将不同的元素属性拆分为多个重复行_Xml_Xslt - Fatal编程技术网

Xml 将不同的元素属性拆分为多个重复行

Xml 将不同的元素属性拆分为多个重复行,xml,xslt,Xml,Xslt,我正在尝试转换XML,我有多种不同的输入。我尝试了很多解决方案,比如 但是在我的例子中,我有不同的元素和不同的属性。 有什么建议吗 输入: <ROOT> <Data X="1233" Y="1:30:57" Z="abcd"/> <Info T="1:30:57" F="xyz" H="1234" "/> 您的数据实际上格式不正确,这意味着您的属性格式不正确 <ROOT> <Data "X=1233,Y=1:30:57,Z=ab

我正在尝试转换XML,我有多种不同的输入。我尝试了很多解决方案,比如 但是在我的例子中,我有不同的元素和不同的属性。 有什么建议吗

输入:

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


您的数据实际上格式不正确,这意味着您的属性格式不正确

<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:analyze string做一些事情,但我对此表示怀疑,因为数据不是格式正确的XML。我认为您无法按原样解析属性。

您的数据实际上格式不正确,这意味着您的属性格式不正确

<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:analyze string做一些事情,但我对此表示怀疑,因为数据不是格式良好的XML。我认为您无法按原样解析属性。

解决您问题的方法是使用以下样式表:

<?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>

解决问题的方法是使用以下样式表:

<?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>

如果输入格式正确

<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>

如果输入格式正确

<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>


输入XML和输出XML的格式都不正确。您认为这是一个好问题吗?您的XML格式仍然不完善,存在多余的
Info
元素的末尾,并且
元素未关闭。但是,我添加了一个最终答案。输入XML和输出XML的格式都不正确。您认为这是一个好问题吗?您的XML格式仍然不完善,存在多余的
Info
元素的末尾,并且
根元素
未关闭。但是,我添加了一个最终答案。感谢您的回复。。。如果我的输入格式正确。。。如何将属性拆分为多行?谢谢您的回复。。。如果我的输入格式正确。。。如何将属性拆分为多行?很高兴听到!很高兴听到这个消息!