أريد وظيفة مطابقة التعبير العادي، ولكن لا توجد مثل هذه الوظيفة في XPath 1.0.
ولم يكن لدي أي خيار سوى توسيع أحد هذه المقالات بنفسي، وبعد البحث على الإنترنت، وجدت مقالة جيدة.
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
تحدد هذه المقالة التقسيم والاستبدال، ولكن لا يوجد تطابق.
اضطررت إلى توسيعه على أساسه، بعد
مراقبة الكود بعناية، وجدت أنه من السهل جدًا توسيع الوظيفة، فقط قم بتعديل هذه الفقرات:
1: CustomContext.cs.
// وظيفة لحل الإشارات إلى وظائفي المخصصة.
التجاوز العام IXsltContextFunction ResolveFunction (بادئة السلسلة،
اسم السلسلة، XPathResultType[] ArgTypes)
{
XPathRegExtensionFunction func = null;
// قم بإنشاء مثيل لفئة وظيفة الامتداد المناسبة.
التبديل (الاسم)
{
حالة "المطابقة":
//الاستخدام
// myFunctions:Matches(string source, string Regex_pattern) تُرجع Boolean
func = new XPathRegExtensionFunction("Match", 2, 2, new
XPathResultType[] {XPathResultType.String, XPathResultType.String}
، XPathResultType.Boolean );
استراحة؛
حالة "الانقسام":
//الاستخدام
// myFunctions:Split(string source, string Regex_pattern, int n) يُرجع السلسلة
func = new XPathRegExtensionFunction("Split"، 3, 3, new
XPathResultType[] {XPathResultType.String، XPathResultType.String،
XPathResultType.Number}, XPathResultType.String);
استراحة؛
حالة "استبدال":
//الاستخدام
// myFunctions:Replace (مصدر السلسلة، سلسلة Regex_pattern، سلسلة استبدال_سلسلة) تُرجع السلسلة
func = new XPathRegExtensionFunction("Replace", 3, 3, new
XPathResultType[] {XPathResultType.String، XPathResultType.String،
XPathResultType.String}, XPathResultType.String);
استراحة؛
}
وظيفة العودة؛
}
2: XPathRegExtensionFunction.cs
// يتم استدعاء هذه الطريقة في وقت التشغيل لتنفيذ الوظيفة المحددة من قبل المستخدم.
استدعاء الكائن العام (XsltContext xsltContext، object[] args،
XPathNavigator docContext)
{
ريجكس ص؛
سلسلة str = فارغة؛
// وظيفتا ملحق XPath المخصصتان
التبديل (m_FunctionName)
{
حالة "المطابقة":
r = new Regex(args[1].ToString());
MatchCollection m = r.Matches(args[0].ToString());
إذا (م.العدد == 0)
{
عودة كاذبة.
}
آخر
{
عودة صحيحة؛
}
استراحة؛
حالة "انقسام":
r = new Regex(args[1].ToString());
string[] s1 = r.Split(args[0].ToString());
int n = Convert.ToInt32(args[2]);
إذا (s1.Length < n)
شارع = "";
آخر
str = s1[n - 1];
استراحة؛
حالة "استبدال":
r = new Regex(args[1].ToString());
string s2 = r.Replace(args[0].ToString(), args[2].ToString());
شارع = s2؛
استراحة؛
}
العودة (كائن) شارع؛
}
هناك ملف آخر، XPathExtensionVariable.cs، ليس له أي علاقة بتوسيع الوظيفة، فهو يُستخدم لتعيين المعلمات.
بعد تعديل هذين الملفين، يمكنك الاتصال:
query = navigator.Compile("xdUtil:Match(9,'\d')");
CustomContext cntxt = new CustomContext();
// أضف تعريف مساحة الاسم لبادئة myFunctions.
cntxt.AddNamespace("xdUtil", " http://myXPathExtensionFunctions ");
query.SetContext(cntxt);
تقييم (الاستعلام، الملاح)؛
بالطبع، سيكون أمرًا رائعًا أن يدعم XPath2.0. جميع وظائف XPath2.0 هذه مدعومة بشكل مدمج، ولكن للأسف لا يبدو أنها مدعومة حتى الآن.
الكود الكامل هنا: