Sar*_*els 5 xml xslt xml-attribute reporting-services
我想用以下数据翻译XML文件:
<FlatData>
<Details1_Collection>
<Details1 Customer1="Customer" Total1="3" />
...
</Details1_Collection>
</FlatData>
Run Code Online (Sandbox Code Playgroud)
我感兴趣的数据是每个属性及其值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" />
Run Code Online (Sandbox Code Playgroud)
这些不同Details1不会出现在相同的源XML文件中,而是出现在不同的文件中.但是,我想在每个上使用相同的XSL.
我以为我需要类似的东西,<xsl:value-of select="@attribute_name"/>但是@attribute_name当我事先不知道会有什么属性时我该怎么做?另外,如何捕获属性名称?我想将上面的源XML分解为:
<Details1>
<Customer1>Customer</Customer1>
<Total1>3</Total1>
</Details1>
Run Code Online (Sandbox Code Playgroud)
编辑:感谢您的回复!但是,我遇到的问题不仅仅是以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<FlatData>
<Details1_Collection></Details1_Collection>
</FlatData>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了lavinio和JörnHorstmann的答案,并尝试将两者结合起来.我运行这个命令:
msxsl.exe -o output.xml input.xml transform.xsl
Run Code Online (Sandbox Code Playgroud)
我认为阻碍的是输入文件中的命名空间:
<Report Name="MyReport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MyReport">
Run Code Online (Sandbox Code Playgroud)
由于 Microsoft SQL Reporting Services 2008 命名空间是输入 XML 的一部分,因此难度增加。起初我并没有意识到这<Report Name="MyReport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="MyReport">是一条如此重要的台词。感谢 Pavel Minaev 的命名空间评论。以下 XSL 可以提取我想要的数据:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="EXQC005">\n <xsl:output method="xml" indent="yes" encoding="utf-8"/>\n\n <xsl:template match="/">\n <xsl:for-each select="a:Report/a:FlatData/a:Details1_Collection/a:Details1">\n <xsl:element name="{name(.)}">\n <xsl:for-each select="@*">\n <xsl:element name="{name(.)}">\n <xsl:value-of select="."/>\n </xsl:element>\n </xsl:for-each>\n </xsl:element>\n </xsl:for-each>\n </xsl:template>\n</xsl:stylesheet>\nRun Code Online (Sandbox Code Playgroud)\n\n我想我会尝试清理它以使用拉维尼奥apply-templates建议的风格。还要感谢J\xc3\xb6rn Horstmann提供的循环代码。弄清楚为什么 Reporting Services 报表最初转储时将值设置为报表名称而不是架构 URL会很有趣。select="@*"for-eachxmlns
当我完善这个 XSL 时,我将继续更新这个答案。
\n\n编辑: 这里是一个与命名空间无关的版本,因为对于 Reporting Services 中的每个不同的报告,显然会有不同的命名空间:
\n\n<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\n <xsl:output method="xml" indent="yes" encoding="utf-8"/>\n\n <xsl:template match="/">\n <xsl:for-each select="*[local-name()=\'Report\']/*[local-name()=\'FlatData\']/*[local-name()=\'Details1_Collection\']/*[local-name()=\'Details1\']">\n <Details>\n <xsl:for-each select="@*">\n <xsl:element name="{name(.)}">\n <xsl:value-of select="."/>\n </xsl:element>\n </xsl:for-each>\n </Details>\n </xsl:for-each>\n </xsl:template>\n</xsl:stylesheet>\nRun Code Online (Sandbox Code Playgroud)\n