Saya ingin fungsi pencocokan ekspresi reguler, tetapi tidak ada fungsi seperti itu di XPath 1.0.
Saya tidak punya pilihan selain mengembangkannya sendiri, dan setelah mencari di Internet, ada artikel bagus.
http://www.microsoft.com/china/MSDN/library/data/xml/AddingCustomFunctionstoXpath.mspx?mfr=true
Artikel ini mendefinisikan pemisahan dan penggantian, namun tidak ada kecocokan.
Saya harus mengembangkannya berdasarkan itu. Setelah
mengamati kode dengan cermat, saya menemukan bahwa memperluas suatu fungsi sangat mudah, cukup ubah paragraf ini:
1: CustomContext.cs
// Fungsi untuk menyelesaikan referensi ke fungsi khusus saya.
penggantian publik IXsltContextFunction ResolveFunction(awalan string,
nama string, XPathResultType[] ArgTypes)
{
Fungsi XPathRegExtensionFunction = null;
// Membuat instance kelas fungsi ekstensi yang sesuai.
beralih (nama)
{
kasus "Cocokkan":
//Penggunaan
// myFunctions:Matches(string source, string Regex_pattern) mengembalikan Boolean
func = new XPathRegExtensionFunction("Cocok", 2, 2, baru
XPathResultType[] {XPathResultType.String, XPathResultType.String}
, XPathResultType.Boolean );
merusak;
kasus "Berpisah":
//Penggunaan
// myFunctions:Split(string source, string Regex_pattern, int n) mengembalikan string
func = new XPathRegExtensionFunction("Split", 3, 3, baru
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.Number}, XPathResultType.String);
merusak;
kasus "Ganti":
//Penggunaan
// myFunctions:Replace(string source, string Regex_pattern, string replacement_string) mengembalikan string
func = new XPathRegExtensionFunction("Ganti", 3, 3, baru
XPathResultType[] {XPathResultType.String, XPathResultType.String,
XPathResultType.String}, XPathResultType.String);
merusak;
}
fungsi pengembalian;
}
2: XPathRegExtensionFunction.cs
// Metode ini dipanggil pada saat run time untuk menjalankan fungsi yang ditentukan pengguna.
pemanggilan objek publik(XsltContext xsltContext, objek[] args,
Konteks dokumen XPathNavigator)
{
Regex r;
string str = nol;
// Dua fungsi ekstensi XPath khusus
beralih (m_FunctionName)
{
kasus "Cocokkan":
r = Regex baru(args[1].ToString());
MatchCollection m = r.Matches(args[0].ToString());
jika (m.Hitungan == 0)
{
kembali salah;
}
kalau tidak
{
kembali benar;
}
istirahat;
kasus "Berpisah":
r = Regex baru(args[1].ToString());
string[] s1 = r.Split(args[0].ToString());
int n = Konversi.ToInt32(args[2]);
if (s1.Panjang < n)
str = "";
kalau tidak
str = s1[n - 1];
merusak;
kasus "Ganti":
r = Regex baru(args[1].ToString());
string s2 = r.Ganti(args[0].ToString(), args[2].ToString());
str = s2;
merusak;
}
kembali (objek)str;
}
File lain, XPathExtensionVariable.cs, sebenarnya tidak ada hubungannya dengan perluasan fungsi. File ini digunakan untuk mengatur parameter.
Setelah kedua file ini dimodifikasi, Anda dapat memanggil:
kueri = navigator.Kompilasi("xdUtil:Match(9,'\d')");
Konteks Kustom cntxt = Konteks Kustom baru();
// Tambahkan definisi namespace untuk awalan myFunctions.
cntxt.AddNamespace("xdUtil", " http://myXPathExtensionFunctions ");
kueri.SetContext(cntxt);
Evaluasi (kueri, navigator);
Tentu saja, akan lebih bagus jika mendukung XPath2.0. Semua fungsi XPath2.0 ini didukung secara bawaan, tetapi sayangnya sepertinya belum didukung.
Kode lengkapnya ada di sini: