xml – 关于SSRS报告的XSLT
我想用以下数据翻译
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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |