XSLT:创建新的 xml/csv 结构

问题描述 投票:0回答:1

我想请求您的指导,以更好地实现预期的输出。我有一个我无法控制的 XSLT 文件,我想应用修改初始结构的转换。

我的目标是根据 all_releases 结构中找到的年份重新创建 report_entry 结构。

XML 结构(输入)

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="http://www.gaming.org/">
  <wd:Report_Entry>
    <wd:id>150</wd:id>
    <wd:name>Call-of-Duty</wd:name>
    <wd:all_releases>
        <wd:year>2017</wd:year>
    </wd:all_releases>
    <wd:all_releases>
        <wd:year>2020</wd:year>
    </wd:all_releases>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>250</wd:id>
    <wd:name>Metal Slug</wd:name>
    <wd:all_releases>
        <wd:year>2003</wd:year>
    </wd:all_releases>
  </wd:Report_Entry>
</wd:Report_Data>

预期的 XML 结构(输入)

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="http://www.gaming.org/">
  <wd:Report_Entry>
    <wd:id>150</wd:id>
    <wd:name>Call-of-Duty</wd:name>
    <wd:year>2017</wd:year>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>150</wd:id>
    <wd:name>Call-of-Duty</wd:name>
    <wd:year>2020</wd:year>
  </wd:Report_Entry>
  <wd:Report_Entry>
    <wd:id>250</wd:id>
    <wd:name>Metal Slug</wd:name>
    <wd:year>2003</wd:year>
  </wd:Report_Entry>
</wd:Report_Data>

我的XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:wd="http://www.gaming.org/" >
<xsl:output method="text" byte-order-mark="yes" indent="no" encoding="utf-8"/>

    <xsl:template match="/">
        <File>
         <xsl:call-template name="Header"/>
         <xsl:text>&#xa;</xsl:text>
         <xsl:for-each select="/wd:Report_Data/wd:Report_Entry"> 
            <xsl:call-template name="Rows"/>
        </xsl:for-each> 
        </File>
    </xsl:template>

    <xsl:template name="Header">
        <xsl:text>"id";</xsl:text>
        <xsl:text>"name";</xsl:text>
        <xsl:text>"year";</xsl:text>
    </xsl:template>

    <xsl:template name="Rows">
        <col>"<xsl:value-of select="wd:id"/>";</col>
        <col>"<xsl:value-of select="wd:name"/>";</col>
        <col>"<xsl:value-of select="wd:all_releases/wd:year"/>";</col>
    </xsl:template>
</xsl:stylesheet>

电流输出

<File xmlns:wd="http://www.gaming.org/">"id";"name";"year";
   <col>"1000";</col>
   <col>"Call-of-Duty";</col>
   <col>"2017 2020";</col>
   <col>"2000";</col>
   <col>"Metal Slug";</col>
   <col>"2003";</col>
</File>

预期产量

<File xmlns:wd="http://www.gaming.org/">"id";"name";"year";
   <col>"150";</col>
   <col>"Call-of-Duty";</col>
   <col>"2017";</col>
   <col>"150";</col>
   <col>"Call-of-Duty";</col>
   <col>"2020";</col>
   <col>"250";</col>
   <col>"Metal Slug";</col>
   <col>"2003";</col>
</File>
xslt xslt-2.0 xslt-grouping
1个回答
0
投票

我不完全理解你的输出格式。它显然是 XML,但您现有的样式表指定

text
作为输出方法,这对我来说毫无意义。

我认为这样的事情应该会产生你想要的结果或至少接近它:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="http://www.gaming.org/">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/wd:Report_Data ">
    <File>
        <xsl:text>"id";"name";"year";&#10;</xsl:text>
        <xsl:for-each select="wd:Report_Entry">
            <xsl:variable name="idname">
                <col>"<xsl:value-of select="wd:id"/>";</col>
                <col>"<xsl:value-of select="wd:name"/>";</col>
            </xsl:variable>
            <xsl:for-each select="wd:all_releases">
                <xsl:copy-of select="$idname"/>
                <col>"<xsl:value-of select="wd:year"/>";</col>
            </xsl:for-each>
        </xsl:for-each>
    </File>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.