使用 XSLT 进行 XML 验证和从 XSLT 调用自定义函数





4.00/5 (2投票s)
根据定义的 XSL 验证 XML
引言
在本文中,我将讨论如何根据定义的 XSL 验证 XML。 在阅读本文之前,必须具备 XML 和 XSL 的基本知识。
考虑以下 XML 作为我们应用程序的输入 (UserCheck.xml)
<?xml version="1.0" encoding="utf-16"?>
<root xmlns:func="urn:actl-xslt">
<User>
<UserName>suryaprakash</UserName>
<Password>password</Password>
</User>
</root>
此示例描述了以下业务规则
- 如果不存在
UserName
和Password
节点,则生成 XML 错误作为输出。 - 如果
UserName
和Password
节点为空,则生成 XML 错误作为输出。 - 检查用户和密码是否存在于数据库中,并生成 XML 成功或错误作为输出。
如果存在任何错误,输出将如下所示,并将插入到 XML 文件 (result.xml) 中。
每个 ERROR
标签将使用 ERRORMSG
和 ERRORCODE
表示每个错误。
<root xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:func="urn:actl-xslt">
<OUTPUT>
<ERROR>
<ErrorMsg>
UserName Node Contains Invalid Data
</ErrorMsg>
<ErrorCode>
ERR_003
</ErrorCode>
</ERROR>
</OUTPUT>
</root>
让我们通过以下步骤进入一个示例
- 步骤 1:定义 XML
- 步骤 2:根据上述定义的业务规则定义 XSL
- 步骤 3:定义将从 XSL 调用函数
- 步骤 4:实现代码,使用 XSL 验证 XML,如下所示,该代码将从 XSL 调用
步骤 1:定义 XML
考虑以下 XML 作为我们的示例输入
<?xml version="1.0" encoding="utf-16"?>
<root xmlns:func="urn:actl-xslt">
<User>
<UserName>suryaprakash</UserName>
<Password>password</Password>
</User>
</root>
步骤 2:根据上述定义的业务规则定义 XSL
<?xml version="1.0"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:func="urn:actl-xslt">
<xsl:template match="root">
<root>
<xsl:for-each select="User">
<OUTPUT>
<xsl:if test="not(UserName)">
<ERROR>
<ErrorMsg>
UserName Node not present
</ErrorMsg>
<ErrorCode>
ERR_001
</ErrorCode>
</ERROR>
</xsl:if>
<xsl:if test="not(Password)">
<ERROR>
<ErrorMsg>
Password Node not present
</ErrorMsg>
<ErrorCode>
ERR_002
</ErrorCode>
</ERROR>
</xsl:if>
<xsl:if test="UserName=''">
<ERROR>
<ErrorMsg>
UserName Node Contains Invalid Data
</ErrorMsg>
<ErrorCode>
ERR_003
</ErrorCode>
</ERROR>
</xsl:if>
<xsl:if test="Password=''">
<ERROR>
<ErrorMsg>
Password Node Contains Invalid Data
</ErrorMsg>
<ErrorCode>
ERR_004
</ErrorCode>
</ERROR>
</xsl:if>
<xsl:value-of select="func:checkUserExist('UserName','Password')" />
</OUTPUT>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
对于上述 XSL,以下是代码注释
代码注释 #1
xmlns:func="urn:actl-xslt"
请注意,我在这里添加的属性是 - xmlns:func="urn:actl-xslt"
。
代码注释 #2
添加到我的外部方法 func:checkUserExist('UserName','Password')
的前缀如下
<xsl:value-of select="func:checkUserExist('UserName','Password')" />
代码注释 #3
<xsl:if test="not(UserName)">
此标签用于检查是否存在 USERNAME
节点。
代码注释 #4
<xsl:if test="UserName=''">
此标签用于检查 USERNAME
节点中的内容是否为空。
步骤 3:定义将从 XSL 调用函数
此函数将从 XSL 调用,定义为 <xsl:value-of select="func:checkUserExist('UserName','Password')" />
。
我们不是检查用户名是否与数据库匹配,而是与 static
值进行检查。 如果用户名匹配,则返回 Success string
,否则将返回 ErrorStrings
。
public string checkUserExist(string uName, string pWord)
{
string returnValue = string.Empty;
if (uName == "prakash")
{
returnValue = " <SUCCESS> <SuccessMsg>
SUCESSS </SuccessMsg><SuccessCode>SUC_000
</SuccessCode> </SUCCESS> ";
}
else
{
returnValue = " <ERROR> <ErrorMsg>
UserName/Password is invalid!.</ErrorMsg>
<ErrorCode>ERR_005</ErrorCode> </ERROR> ";
}
return returnValue;
}
步骤 4:实现代码,使用 XSL 验证 XML,如下所示,该代码将从 XSL 调用
以下函数将在主方法中调用,该函数为 XML 输入、XSL 输入和 XML 输出(result.xml)声明 3 个主要变量。
public void CheckUserXslt()
{
string sourceDoc = @"D:\Surya Prakash\WorkAround\GopalSample\XML\CheckUser.XML";
string xsltDoc = @"D:\Surya Prakash\WorkAround\GopalSample\XML\CheckUser.xslt";
string resultDoc = @"D:\Surya Prakash\WorkAround\GopalSample\XML\result.xml";
XsltArgumentList xsltArguments = null;
XsltExtension xsltExtension = new XsltExtension();
xsltArguments = new XsltArgumentList();
xsltArguments.AddExtensionObject("urn:actl-xslt", xsltExtension);
XPathDocument myXPathDocument = new XPathDocument(sourceDoc);
XslTransform myXslTransform = new XslTransform();
XmlTextWriter writer = new XmlTextWriter(resultDoc, null);
myXslTransform.Load(xsltDoc);
myXslTransform.Transform(myXPathDocument, xsltArguments, writer);
writer.Close();
StreamReader stream = new StreamReader(resultDoc);
}
最后,通过修改输入 XML 并查看 result.xml 中的输出来运行应用程序。
编码愉快… 希望这有帮助!