加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 关于SSRS报告的XSLT

发布时间:2020-12-15 23:56:08 所属栏目:百科 来源:网络整理
导读:我想用以下数据翻译 XML文件: FlatData Details1_Collection Details1 Customer1="Customer" Total1="3" / ... /Details1_Collection/FlatData 我感兴趣的数据是每个Details1中的属性及其值.问题是这些属性在我想要翻译的每个XML文件中都不一定相同,我想要
我想用以下数据翻译 XML文件:
<FlatData>
    <Details1_Collection>
        <Details1 Customer1="Customer" Total1="3" />
        ...
    </Details1_Collection>
</FlatData>

我感兴趣的数据是每个Details1中的属性及其值.问题是这些属性在我想要翻译的每个XML文件中都不一定相同,我想要一个可以处理这样的Details1的通用XSL:

<Details1 Customer1="Customer" Total1="3" />
<Details1 Name="Jim" Age="14" Weight="180" />
<Details1 Date="2009-07-27" Range="1-5" Option1="True" />

这些不同的Details1不会出现在同一个源XML文件中,而是出现在不同的文件中.但是,我想在每个上使用相同的XSL.

我以为我需要类似< xsl:value-of select =“@ attribute_name”/>但是当我事先不知道会有什么属性时,我会为@attribute_name添加什么?另外,如何捕获属性名称?我想将上面的源XML分解为:

<Details1>
    <Customer1>Customer</Customer1>
    <Total1>3</Total1>
</Details1>

编辑:感谢您的回复!但是,我遇到的问题不仅仅是以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<FlatData>
<Details1_Collection></Details1_Collection>
</FlatData>

我已经尝试了lavinio和J?rnHorstmann的答案,并尝试将两者结合起来.我运行这个命令:

msxsl.exe -o output.xml input.xml transform.xsl

我认为在输入文件中出现的问题是namespace:

<Report Name="MyReport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MyReport">
由于Microsoft SQL Reporting Services 2008命名空间是输入XML的一部分,因此增加了难度.我一开始并没有意识到< Report Name =“MyReport”xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns =“MyReport”>是如此重要的一句话.感谢Pavel Minaev的 namespace comment.以下XSL致力于提取我想要的数据:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="EXQC005">
  <xsl:output method="xml" indent="yes" encoding="utf-8"/>

  <xsl:template match="/">
    <xsl:for-each select="a:Report/a:FlatData/a:Details1_Collection/a:Details1">
      <xsl:element name="{name(.)}">
        <xsl:for-each select="@*">
          <xsl:element name="{name(.)}">
            <xsl:value-of select="."/>
          </xsl:element>
        </xsl:for-each>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

我想我会尝试清理它以使用lavinio建议的apply-templates样式.还要感谢J?rn Horstmann for for-each循环中的select =“@ *”代码.有趣的是弄清楚为什么最初将Reporting Services报告转储,并将xmlns值设置为报告的名称,而不是schema URL.

当我改进这个XSL时,我会继续更新这个答案.

编辑:这是一个与命名空间无关的版本,因为对于Reporting Services的每个不同的报告,显然会有一个不同的命名空间:

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

  <xsl:template match="/">
    <xsl:for-each select="*[local-name()='Report']/*[local-name()='FlatData']/*[local-name()='Details1_Collection']/*[local-name()='Details1']">
      <Details>
        <xsl:for-each select="@*">
          <xsl:element name="{name(.)}">
            <xsl:value-of select="."/>
          </xsl:element>
        </xsl:for-each>
      </Details>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读