【问题标题】:Mapping XML elements using XSLT使用 XSLT 映射 XML 元素
【发布时间】:2018-01-19 04:31:52
【问题描述】:

我有一个 entity,它由 nametypenumber 元素组成。不幸的是,它以我不想要的格式呈现。我不允许修改呈现该实体的代码。我唯一可以做的就是创建一个 XSL 文件,将我的输入转换为所需的输出。

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

我想以更合乎逻辑的模式输出实体,例如1st 的名称,1st 的类型,1st 实体的编号。后跟 2nd 的名称、2nd 的类型、2nd 实体的编号等。我也想把每个将这些元素整合成一个名为Entity的元素。

例如,我将如何转换以下 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>

【问题讨论】:

    标签: xml xslt


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2012-10-11
      相关资源
      最近更新 更多