所有XML类文件的动态XSLT

时间:2014-11-01 11:39:46

标签: xml xslt dynamic

我是XSLT的新手,我也开发了Audit Trail系统, 每个动作(例如Edit,Add New和Remove)将跟踪每个对象,我已将对象的OldValue和NewValue作为XML插入到DB中

在UI中,我将向用户显示审核详细信息,如下图所示:

enter image description here

但我决定显示全名'而不是' FullName'或者'日历名称'而不是' CalendarName' 或者将来我想用多种语言作为标题。

生成的OldValue XML是:

   <BasicInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserIdentify>100</UserIdentify>
  <UserName>user1</UserName>
  <FullName>Ali Hassanabadi</FullName>
  <Email>ali.h@test.com</Email>
  <LogInCounter>0</LogInCounter>
  <Title>Dr.</Title>
  <Label />
  <Theme>dark-hive</Theme>
  <Language>English</Language>
  <CalendarName>Gregorian</CalendarName>
  <ExpireDate xsi:nil="true" />
  <Status>1</Status>
</BasicInfo>

所以XSLT文件可以用来将XML转换为XHTML,但问题是我有很多类他们正在使用审计系统。 我认为为每个类定义XSLT文件并不好,所以我得出了这个结论 为每个指定属性标题的属性定义自定义属性,如下所示:

public class BasicInfo  : IAuditable
{
    [AuditingTitle("Full Name")]
    public string FullName
    {
        get;
        set;
    }
}

现在当显示旧值或新值时,我通过调用程序集名称找到类名及其属性以及 对于每个属性,我必须通过反射找到它的属性标题。

这样的事情:

   <?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/Found"> 
        <div>
          <b>Here bind to found title of properties</b>
          <xsl:value-of select="PropertyValue"/>
        </div> 
  </xsl:template>
</xsl:stylesheet>

那么有没有办法定义一个与所有生成的XML兼容的XSLT(动态)?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不太确定我是否正确解释了您的问题,但这只是关于转换</BasicInfo>&#34;记录&#34;使用XML标记名作为键进入键值对结构这是一种可能的方法,在XSLT 1.0中将entityname从外部传递给XSLT进程:

<?xml version="1.0" encoding="UTF-8"?>
<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:param name="entityname" select="'BasicInfo'"/>

  <xsl:template match="/*">
    <xsl:if test="local-name() = $entityname">
      <tab>
        <xsl:for-each select="*">
          <row>
            <div><xsl:value-of select="local-name()"/></div>
            <div><xsl:value-of select="."/></div>
          </row>
        </xsl:for-each>
      </tab>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

请注意,这种方法有点笨拙,因为XSLT 1.0不允许在匹配表达式中使用参数/变量(参见How to use a parameter in a xslt as a XPath?)。

XSLT将生成以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<tab>
  <row>
    <div>UserIdentify</div>
    <div>100</div>
  </row>
  <row>
    <div>UserName</div>
    <div>user1</div>
  </row>
  <row>
    <div>FullName</div>
    <div>Ali Hassanabadi</div>
  </row>
  <row>
    <div>Email</div>
    <div>ali.h@test.com</div>
  </row>
  <row>
    <div>LogInCounter</div>
    <div>0</div>
  </row>
  <row>
    <div>Title</div>
    <div>Dr.</div>
  </row>
  <row>
    <div>Label</div>
    <div/>
  </row>
  <row>
    <div>Theme</div>
    <div>dark-hive</div>
  </row>
  <row>
    <div>Language</div>
    <div>English</div>
  </row>
  <row>
    <div>CalendarName</div>
    <div>Gregorian</div>
  </row>
  <row>
    <div>ExpireDate</div>
    <div/>
  </row>
  <row>
    <div>Status</div>
    <div>1</div>
  </row>
</tab>