使用XSLT映射XML元素

时间:2017-08-10 19:21:01

标签: xml xslt

我有实体,其中包含名称类型数字元素。不幸的是,它以我不想要的格式呈现。我不允许修改呈现该实体的代码。我唯一能做的就是创建一个XSL文件,将我的输入转换为理想的输出。

假设我们有3个实体。 XML文件以错误的模式显示它们。它显示第一个实体的名称,第二个的名称,然后是第三个​​的名称。相同的模式适用于类型和数字。它显示第一个实体的类型,第二个的类型,然后是第三个​​实体的类型等。

我想以更合理的模式输出实体,例如 1st 的名称, 1st 的类型, 1st 实体的编号。接下来是 2nd 的名称, 2nd 的类型, 2nd 实体的编号等等。我还要将每个这些元素被称为实体

因此,例如,我将如何转换以下XML输入

<root>
    <Name>Harambe</Name>
    <Name>John Smith</Name>
    <Name>Mazda</Name>

    <Type>Ape</Type>
    <Type>Human</Type>
    <Type>Car</Type>

    <Number>1111</Number>
    <Number>2222</Number>
    <Number>3333</Number>
</root>

进入这个:

<root>
     <Entity>
         <Name>Harambe</Name>
         <Type>Ape</Type>
         <Number>1111</Number>
     </Entity>

     <Entity>
         <Name>John Smith</Name>
         <Type>Human</Type>
         <Number>2222</Number>
     </Entity>

     <Entity>
         <Name>Mazda</Name>
         <Type>Car</Type>
         <Number>3333</Number>
     </Entity>             
</root>

1 个答案:

答案 0 :(得分:1)

你为什么不这样做:

XSLT 1.0

<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:for-each select="Name">
            <xsl:variable name="i" select="position()" />
            <Entity>
                <xsl:copy-of select=". | following-sibling::Type[$i] | following-sibling::Number[$i]"/>
            </Entity>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>