我是XSLT的新手,我也开发了Audit Trail系统, 每个动作(例如Edit,Add New和Remove)将跟踪每个对象,我已将对象的OldValue和NewValue作为XML插入到DB中
在UI中,我将向用户显示审核详细信息,如下图所示:
但我决定显示全名'而不是' 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(动态)?
提前致谢。
答案 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>