65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2011 年 11 月 2 日

CPOL

2分钟阅读

viewsIcon

45511

根据定义的 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>

此示例描述了以下业务规则

  1. 如果不存在 UserNamePassword 节点,则生成 XML 错误作为输出。
  2. 如果 UserNamePassword 节点为空,则生成 XML 错误作为输出。
  3. 检查用户和密码是否存在于数据库中,并生成 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 中的输出来运行应用程序。

编码愉快… 希望这有帮助!

© . All rights reserved.