рдЖрдЬ рдореИрдВ
рдПрдХреНрд╕рдПрд╕рдПрд▓рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рднрд╛рд╖рд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ XML рдбреЗрдЯрд╛ рдХреЛ рдХреБрдЫ рдЧреИрд░-рддреБрдЪреНрдЫ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВ рджреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп (рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ) XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд╛рд╡рд╛ рдХреЛрдб рд╕реЗ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рд╢рддрд░рдВрдЬ рдХреА рдмрд┐рд╕рд╛рдд рдкрд░ 8 рд░рд╛рдирд┐рдпреЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рдкреНрд░рд╕рд┐рджреНрдз
рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдЪреВрдВрдХрд┐ XSLT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╢рд╛рдпрдж рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреЛ рдЙрдкрдпреБрдХреНрдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рде рд╣реА рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╢реИрдХреНрд╖рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдореМрдЬреВрджрд╛ XSLT рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХрд╛рдлреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЕрдЧрд░ рд╣рдо рдЬрд╛рд╡рд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкрд╕рдВрдж (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рд╣реЗрдбрд░ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рджреЛ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓,
рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдХреНрд░рд┐рдп рдбреАрдПрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░
рдУрд░реЗрдХрд▓ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдХрдо рдЬреНрдЮрд╛рдд рд╣реИрдВ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╕рд╡рд╛рд▓ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рдмрд░ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЬрд╛рд╡рд╛-рд╕рдВрдЧрдд рдПрдХреНрд╕рдПрд╕рдПрд▓рдЯреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА)ред
рд╕реИрдХреНрд╕рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЖрдЬ рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рдЙрдиреНрдирдд XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд рдЕрд╡рд╕рд░реЛрдВ
рдХрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИред рдпрджреНрдпрдкрд┐ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХреЗрд╡рд▓ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╡рд┐рддрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ,
рдореЛрдЬрд╝рд┐рд▓рд╛ рдкрдмреНрд▓рд┐рдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╕рдВрд╕реНрдХрд░рдг 1.0 рд╕реИрдХреНрд╕рди HE рднреА рд╕рдВрд╕реНрдХрд░рдг 1.0 рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 2.0 рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг XPath рдФрд░ XSLT рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ XSLT 2.0 рдХрд╛ рд╕рдорд░реНрдерди рдХреИрд╕реЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рд▓рдорд╛рдиреЛ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдХрдкреНрд░рд┐рдп
XSLT рдХреБрдХрдмреБрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╕реИрдХреНрд╕рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╝рд╛рд▓рд╛рди рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн, рдХрдо рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ
рдЕрдкрд╛рдЪреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╕рдВрд╕реНрдХрд░рдг 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ ред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди XSLT рд╕рдВрд╕реНрдХрд░рдг 1.0 рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рдЯреНрд░рдореНрдк рдХрд╛рд░реНрдб, Xalan рдФрд░ Saxon рджреЛрдиреЛрдВ,
TrAX рдЙрджреНрдпреЛрдЧ рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдкреВрд░реНрдг рд╕рдорд░реНрдерди рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред
TrAX рдФрд░ JAXP рдХреЗ рдирд╛рдо рдкрд░
TrAX рдПрдХ XML рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди API рд╣реИ рдЬрд┐рд╕реЗ XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдмрд╛рддрдЪреАрдд рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЗрдЪреНрдЫреБрдХ рд╕рдВрдЧрдардиреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ 6 рдлрд░рд╡рд░реА, 2001 рдХреЛ рд╕реВрд░реНрдп рджреНрд╡рд╛рд░рд╛
JAXP рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред JAXP рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, JAXP рдЖрдкрдХреЛ
DOM рдФрд░
SAX (XSLT рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕рд╣рд┐рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рд╣реБрдП рд╣реИрдВрдбрд▓рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд╛рд╡рд╛ рдореЗрдВ XML рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЬрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, XML рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ XPath рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рд╕реЗ рдХреБрдЫ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
XML рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
<?xml version="1.0"?> <size>5</size>
рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдЗрд╕ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рддрд░рдВрдЬ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ)ред
DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ private void test_xpath_dom() throws Exception { InputSource in = new InputSource(new FileInputStream("xml/data.xml")); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().parse(in); NodeIterator nl = XPathAPI.selectNodeIterator(doc, "/size"); Node n; while ((n = nl.nextNode())!= null) { if (n.getNodeType() == Node.TEXT_NODE) { System.out.println(n.getNodeValue()); } else { System.out.println(n.getTextContent()); } } }
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ XPath рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЗрдЯреЗрд░реЗрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдиреЛрдбреНрд╕ (рдПрдХ рдиреЛрдб рд╕реЗ рдорд┐рд▓рдХрд░) рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдореВрд▓реНрдп (рдпрджрд┐ рдпрд╣ рдПрдХ рдкрд╛рда рдиреЛрдб рд╣реИ) рдпрд╛ рдкрд╛рда рд╕рд╛рдордЧреНрд░реА (рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХреНрд╡реЗрд░реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдореЗрдВ рд╕реНрдХреЗрд▓рд░ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдФрд░ рднреА рдЖрд╕рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣рдо DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреЗрд▓рд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ private void test_xpath_dom() throws Exception { System.setProperty(JAVAX_TRANSFORM_FACTORY, XALAN_TRANSFORM_FACTORY); InputSource in = new InputSource(new FileInputStream("xml/data.xml")); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().parse(in); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression xpathExpression = xpath.compile("/size"); System.out.println(xpathExpression.evaluate(doc)); }
рдХрднреА-рдХрднреА (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдбрд╝реА XML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп) рд╡реЗ DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, XML рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SAX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред JAXP рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдХреЛ рджреВрд╕рд░реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SAX рд╕реЗ DOM) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдпрджрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рд╕реНрдЯрд╛рдЗрд▓рд╢реАрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ рд╕рдорд╛рди рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИ):
SAX рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ private void test_xpath_sax_file() throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(DOMResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler h = stf.newTransformerHandler(); XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setContentHandler(h); reader.setProperty("http://xml.org/sax/properties/lexical-handler", h); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().newDocument(); Result out = new DOMResult(doc); h.setResult(out); reader.parse("xml/data.xml"); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression xpathExpression = xpath.compile("/size"); System.out.println(xpathExpression.evaluate(doc)); } else { throw new Exception("Can''t support SAXSource or DOMResult"); } }
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдордиреЗ XML рдлрд╝рд╛рдЗрд▓ рдХреЛ RAM рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрднреА рднреА DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдмрдбрд╝реА XML рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп SAX рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдмрдбрд╝реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рдЫреЛрдЯреА рдлрд╛рдЗрд▓реЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдЖрдЗрдП SAX рдИрд╡реЗрдВрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
SAX рд╕реНрдЯреНрд░реАрдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ private void generateData(ContentHandler h, String data) throws SAXException { h.startDocument(); h.startElement("", "size", "size", new AttributesImpl()); h.characters(data.toCharArray(), 0, data.length()); h.endElement("", "size", "size"); h.endDocument(); } private void test_xpath_sax_stream(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(DOMResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler h = stf.newTransformerHandler(); DocumentBuilderFactory df = DocumentBuilderFactory.newInstance(); Document doc = df.newDocumentBuilder().newDocument(); Result out = new DOMResult(doc); h.setResult(out); generateData(h, size); XPathFactory xpathFactory = XPathFactory.newInstance(); XPath xpath = xpathFactory.newXPath(); XPathExpression xpathExpression = xpath.compile("/size"); System.out.println(xpathExpression.evaluate(doc)); } else { throw new Exception("Can''t support SAXSource or DOMResult"); } }
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдпреВрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП startElement рдФрд░ рдПрдВрдбреАрдореЗрдВрдЯ null рдорд╛рдиреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред Xalan рдХреЗ рд▓рд┐рдП, рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди Saxon рдПрдХ NullPointerException рдлреЗрдВрдХрддрд╛ рд╣реИред
рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдЬрдВрдЬреАрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдХрдиреНрд╡реЗрдпрд░ рдмреЗрд▓реНрдЯ private void test_solution(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(); TransformerHandler filter = stf.newTransformerHandler(); TransformerHandler view = stf.newTransformerHandler(); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); generateData(solve, size); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
рдЕрдм рддрдХ, рд╣рдо рдпрд╣рд╛рдВ рддреАрди рдЦрд╛рд▓реА рд╣реИрдВрдбрд▓рд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рдЪрд╛рди рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ XSLT рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдмрд╛рдж рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рд╢реЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд░рд╛рдирд┐рдпреЛрдВ рдХреЛ рд╢рддрд░рдВрдЬ рдХреА рдмрд┐рд╕рд╛рдд рдкрд░ рд░рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╣рд░рд╛ рди рджреЗрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрди рдкрджреЛрдВ рдХреА рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХрд░рдиреА рд╣реЛрдЧреА рдЬреЛ рдХрд╛рд░реНрдп рдХреА рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдкрджреЛрдВ рдХреА рдХреЛрдбрд┐рдВрдЧ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВред рдЪреВрдВрдХрд┐, рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдВрдХрдбрд╝реЗ рдПрдХ рд╣реА рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрд░ рд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рд╕рд╣реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд╢рдорд▓рд╡ рдЕрдВрдХреЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреА рд╕рдВрдЦреНрдпрд╛, рдФрд░ рдорд╛рди рд╕реНрд╡рдпрдВ рдЙрд╕ рдХреНрд╖реИрддрд┐рдЬ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕ рдкрд░ рдЖрдВрдХрдбрд╝рд╛ рд╕реНрдерд┐рдд рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо рджрд╢рдорд▓рд╡ рдЕрдВрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдХрд░, рд╣рдо 1x1 рд╕реЗ 9x9 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧрдгрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдХрд╛рд░ рдХреЛ 8 рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ (5x5 рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдмрд╕ рд╕рд╣реА рд╣реЛрдВрдЧреА)ред XSLT рдХреЛрдб (рдЗрд╕рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╡рд╛рдЪрд╛рд▓рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж) рдХрд╛рдлреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:
solution.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="size"> <result> <xsl:call-template name="queens"> <xsl:with-param name="r"/> <xsl:with-param name="n" select="."/> <xsl:with-param name="s" select="."/> </xsl:call-template> </result> </xsl:template> <xsl:template name="queens"> <xsl:param name="r"/> <xsl:param name="n"/> <xsl:param name="s"/> <xsl:choose> <xsl:when test="$n = 0"> <position> <xsl:copy-of select="$r"/> </position> </xsl:when> <xsl:otherwise> <xsl:call-template name="step"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="n" select="$n"/> <xsl:with-param name="v" select="$s"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="step"> <xsl:param name="r"/> <xsl:param name="n"/> <xsl:param name="v"/> <xsl:param name="s"/> <xsl:if test="$v != 0"> <xsl:variable name="c"> <xsl:call-template name="check"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="v" select="$v"/> </xsl:call-template> </xsl:variable> <xsl:if test="$c != 0"> <xsl:variable name="l"> <xsl:value-of select="concat($v,$r)"/> </xsl:variable> <xsl:call-template name="queens"> <xsl:with-param name="r" select="$l"/> <xsl:with-param name="n" select="$n - 1"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> <xsl:call-template name="step"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="n" select="$n"/> <xsl:with-param name="v" select="$v - 1"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="check"> <xsl:param name="r"/> <xsl:param name="v"/> <xsl:if test="contains($r,$v)">0</xsl:if> </xsl:template> </xsl:stylesheet>
рдпрд╣рд╛рдБ рд╣рдо рд╡рд┐рдХрд░реНрдг рдкрд░ рдпреБрджреНрдз рдХреА рдЬрд╛рдБрдЪ рдХрд┐рдП рдмрд┐рдирд╛, рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЖрдкрд╕реА рд▓рдбрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЬрд╛рдБрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдХрд░:
8 рдмрджрдорд╛рд╢ private void test_solution(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(new StreamSource("xsl/solution.xsl")); TransformerHandler filter = stf.newTransformerHandler(); TransformerHandler view = stf.newTransformerHandler(); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); generateData(solve, size); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
... рдЖрдк "8 рдмрджрдорд╛рд╢реЛрдВ" рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЖрд░реЛрдкреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЖрдкрд╕реА рд▓рдбрд╝рд╛рдИ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВрдЧреЗред рдХреЛрдб рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, XSLT рдЖрдпрд╛рдд рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
queens.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="solution.xsl"/> <xsl:template name="check"> <xsl:param name="r"/> <xsl:param name="v"/> <xsl:choose> <xsl:when test="contains($r,$v)">0</xsl:when> <xsl:otherwise> <xsl:variable name="y"> <xsl:call-template name="additional_check"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="v" select="$v"/> <xsl:with-param name="d" select="1"/> </xsl:call-template> </xsl:variable> <xsl:value-of select="$y"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="additional_check"> <xsl:param name="r"/> <xsl:param name="v"/> <xsl:param name="d"/> <xsl:if test="$d <= string-length($r)"> <xsl:variable name="u" select="substring($r,$d,1)"/> <xsl:variable name="b"> <xsl:call-template name="abs"> <xsl:with-param name="x" select="$v - $u"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$b = $d">0</xsl:when> <xsl:otherwise> <xsl:call-template name="additional_check"> <xsl:with-param name="r" select="$r"/> <xsl:with-param name="v" select="$v"/> <xsl:with-param name="d" select="$d + 1"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:if> </xsl:template> <xsl:template name="abs"> <xsl:param name="x"/> <xsl:choose> <xsl:when test="$x < 0"> <xsl:value-of select="$x * -1"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$x"/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрдЬрд╛рдп рдЖрдпрд╛рдд рдХрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рдорд╛рди рд╣реИ)ред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рднреА рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕ рдпреВрд░реАрд╕реЛрд▓рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕реЗ XSLT рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди URI рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Resolver.java import java.io.File; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.URIResolver; import javax.xml.transform.stream.StreamSource; public class Resolver implements URIResolver { public Source resolve(String href, String base) throws TransformerException { return new StreamSource(new File("xsl/" + href)); } }
... рдФрд░ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЛ рджреЗ рджреЛ:
рд░рд╛рдирд┐рдпрд╛рдБ private void test_queens(String size) throws Exception { TransformerFactory tf = TransformerFactory.newInstance(); + tf.setURIResolver(new Resolver()); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(new StreamSource("xsl/queens.xsl")); TransformerHandler filter = stf.newTransformerHandler(); TransformerHandler view = stf.newTransformerHandler(); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); generateData(solve, size); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
рдмреЗрд╢рдХ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╕рднреА xsl рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рдбрд┐рд╕реНрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордЭреЗрдЧрд╛ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╣рд╛рдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ LOB рдлрд╝реАрд▓реНрдб рд╕реЗ XSLT рдХреЛрдб рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ!
рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рд╕реЗ, рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред
рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ?
рдЬрд┐рд╕ рд░реВрдк рдореЗрдВ рд╣рдордиреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕рдореЗрдВ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдордиреБрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди (рдХреБрдЫ рдорд╛рдирд╕рд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреЗ рдмрд┐рдирд╛) рдкрджреЛрдВ рдХрд╛ рдПрдХ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рднреА рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ XSLT рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИред рдкрд░рд┐рд╡рд░реНрддрди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЙрд▓ рдЬреЛрдбрд╝рдХрд░, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
count.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="result"> <result> <xsl:value-of select="count(position)"/> </result> </xsl:template> </xsl:stylesheet>
... рдпрд╛ рддреЛ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреГрд╢реНрдп рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдПрдВ:
boards.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" version="1.0"> <xsl:output method="html"/> <xsl:template match="/result/position"> <a href="{concat(. , '.html')}"> <xsl:value-of select="."/> </a><br/> <redirect:write select="concat('xml/', . , '.html')"> <style> table { display:block; margin:10px; border:0; border-collapse: collapse; } table tr { border:0; } table tr td { border:1px solid #999; width:15px; height:15px; padding: 0; } .active { background: #898989; } </style> <table border="1" style="border-collapse:collapse"> <xsl:call-template name="line"> <xsl:with-param name="r" select="."/> <xsl:with-param name="s" select="string-length(.)"/> </xsl:call-template> </table> </redirect:write> </xsl:template> <xsl:template name="line"> <xsl:param name="r"/> <xsl:param name="s"/> <xsl:if test="string-length($r) != 0"> <xsl:variable name="x" select="substring($r,1,1)"/> <tr> <xsl:call-template name="col"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="$s"/> </xsl:call-template> </tr> <xsl:call-template name="line"> <xsl:with-param name="r" select="substring($r,2)"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="col"> <xsl:param name="x"/> <xsl:param name="i"/> <xsl:if test="$i != 0"> <xsl:choose> <xsl:when test="$x = $i"><td class="active"/></xsl:when> <xsl:otherwise><td/></xsl:otherwise> </xsl:choose> <xsl:call-template name="col"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="$i - 1"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣:
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдЧреИрд░-рдорд╛рдирдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди Xalan рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП: рд▓рд┐рдЦрдирд╛, рдЬреЛ рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (XSLT 2.0 рдореЗрдВ, рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ)ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ SAX рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдЬреЛ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреБрдЫ рд╣рдж рддрдХ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЬрд╛рджреВ
рд╣рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмреЛрд░реНрдб рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?
рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмреЛрд░реНрдб рдХреЗ рдХреЗрд╡рд▓ 8 рд╕рдВрднрд╛рд╡рд┐рдд рдШреБрдорд╛рд╡ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИрдВ (рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП)ред рд╣рдо рд╕рд╣рд╛рдпрдХ рдЯреЗрдореНрдкрд▓реЗрдЯреЛрдВ рдХреЛ рд╕реНрдерд┐рддрд┐ (рд╣рдорд╛рд░реЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ) рд▓рдВрдмрд╡рдд (рдлреНрд▓рд┐рдк), рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ (рд░рд┐рд╡рд░реНрд╕) рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдФрд░ рдмреЛрд░реНрдб рдХреЛ 90 рдбрд┐рдЧреНрд░реА (рдШреБрдорд╛рдПрдБ) рдШреБрдорд╛рддреЗ рд╣реИрдВ:
utils.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="result"> <result> <xsl:apply-templates/> </result> </xsl:template> <xsl:template match="position"> <position> <xsl:value-of select="."/> </position> <flip> <xsl:call-template name="flip"> <xsl:with-param name="x" select="."/> </xsl:call-template> </flip> <reverse> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="."/> </xsl:call-template> </reverse> <rotate> <xsl:call-template name="rotate"> <xsl:with-param name="x" select="."/> </xsl:call-template> </rotate> </xsl:template> <xsl:template name="flip"> <xsl:param name="x"/> <xsl:call-template name="flip_internal"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="s" select="string-length($x) + 1"/> </xsl:call-template> </xsl:template> <xsl:template name="flip_internal"> <xsl:param name="x"/> <xsl:param name="s"/> <xsl:if test="string-length($x) != 0"> <xsl:value-of select="$s - substring($x,1,1)"/> <xsl:call-template name="flip_internal"> <xsl:with-param name="x" select="substring($x,2)"/> <xsl:with-param name="s" select="$s"/> </xsl:call-template> </xsl:if> </xsl:template> <xsl:template name="reverse"> <xsl:param name="x"/> <xsl:variable name="len" select="string-length($x)"/> <xsl:choose> <xsl:when test="$len < 2"> <xsl:value-of select="$x"/> </xsl:when> <xsl:when test="$len = 2"> <xsl:value-of select="substring($x,2,1)"/> <xsl:value-of select="substring($x,1,1)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="mid" select="floor($len div 2)"/> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="substring($x,$mid+1,$mid+1)"/> </xsl:call-template> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="substring($x,1,$mid)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="rotate"> <xsl:param name="x"/> <xsl:call-template name="rotate_internal"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="1"/> <xsl:with-param name="r"/> </xsl:call-template> </xsl:template> <xsl:template name="rotate_internal"> <xsl:param name="x"/> <xsl:param name="i"/> <xsl:param name="r"/> <xsl:variable name="p"> <xsl:call-template name="index-of"> <xsl:with-param name="input" select="$x"/> <xsl:with-param name="substr" select="$i"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$p = 0"> <xsl:value-of select="$r"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="rotate_internal"> <xsl:with-param name="x" select="$x"/> <xsl:with-param name="i" select="$i + 1"/> <xsl:with-param name="r" select="concat($p,$r)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="index-of"> <xsl:param name="input"/> <xsl:param name="substr"/> <xsl:choose> <xsl:when test="contains($input,$substr)"> <xsl:value-of select="string-length(substring-before($input,$substr))+1"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
рдпрд╣рд╛рдБ рд╣рдордиреЗ рд╕рд▓ рдореИрдВрдЧрд╛рдиреЛ рдХреА "рдПрдХреНрд╕рдПрд╕рдПрд▓рдЯреА рдХрд▓реЗрдХреНрд╢рди рдСрдлрд╝ рд░реЗрд╕рд┐рдкреАрдЬрд╝" рдХреА рдЕрджреНрднреБрдд
рдкреБрд╕реНрддрдХ рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЕрдирдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА-рд╕рд┐рдмрд▓рд┐рдВрдЧ рдЕрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╣реИ:
distinct.xsl <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="utils.xsl"/> <xsl:template match="result"> <result> <xsl:apply-templates/> </result> </xsl:template> <xsl:template match="position"> <xsl:variable name="l" select="preceding-sibling::position"/> <xsl:variable name="a" select="."/> <xsl:variable name="b"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$a"/> </xsl:call-template> </xsl:variable> <xsl:variable name="c"> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="$b"/> </xsl:call-template> </xsl:variable> <xsl:variable name="d"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$c"/> </xsl:call-template> </xsl:variable> <xsl:variable name="e"> <xsl:call-template name="rotate"> <xsl:with-param name="x" select="$a"/> </xsl:call-template> </xsl:variable> <xsl:variable name="f"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$e"/> </xsl:call-template> </xsl:variable> <xsl:variable name="g"> <xsl:call-template name="reverse"> <xsl:with-param name="x" select="$f"/> </xsl:call-template> </xsl:variable> <xsl:variable name="h"> <xsl:call-template name="flip"> <xsl:with-param name="x" select="$g"/> </xsl:call-template> </xsl:variable> <xsl:choose> <xsl:when test="$b = $l"></xsl:when> <xsl:when test="$c = $l"></xsl:when> <xsl:when test="$d = $l"></xsl:when> <xsl:when test="$e = $l"></xsl:when> <xsl:when test="$f = $l"></xsl:when> <xsl:when test="$g = $l"></xsl:when> <xsl:when test="$h = $l"></xsl:when> <xsl:otherwise> <position> <xsl:value-of select="$a"/> </position> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, XSLT 1.0 рдореЗрдВ, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХрд▓ XPath рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди XSLT 2.0 рдореЗрдВ рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ "рд░реИрдк" рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ред
рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдордиреЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░ рд▓реА рд╣реИред
рдпрд╣ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ ...
рдХреМрди рддреЗрдЬ рд╣реИ?
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдорд╛рдк рдкреНрд░рджрд░реНрд╢рди private final static String JAVAX_TRANSFORM_FACTORY = "javax.xml.transform.TransformerFactory"; private final static String SAXON_TRANSFORM_FACTORY = "net.sf.saxon.TransformerFactoryImpl"; private final static String XALAN_TRANSFORM_FACTORY = "org.apache.xalan.processor.TransformerFactoryImpl"; private void test_full(String size) throws Exception { System.setProperty(JAVAX_TRANSFORM_FACTORY, SAXON_TRANSFORM_FACTORY); TransformerFactory tf = TransformerFactory.newInstance(); tf.setURIResolver(new Resolver()); if (tf.getFeature(SAXSource.FEATURE) && tf.getFeature(SAXResult.FEATURE)) { SAXTransformerFactory stf = (SAXTransformerFactory)tf; TransformerHandler solve = stf.newTransformerHandler(new StreamSource("xsl/queens.xsl")); TransformerHandler filter = stf.newTransformerHandler(new StreamSource("xsl/distinct.xsl")); TransformerHandler view = stf.newTransformerHandler(new StreamSource("xsl/count.xsl")); Result result = new StreamResult(new File("xml/result.xml")); solve.setResult(new SAXResult(filter)); filter.setResult(new SAXResult(view)); view.setResult(result); Long timestamp = System.currentTimeMillis(); generateData(solve, size); System.out.println("Elapsed Time: " + Long.toString(System.currentTimeMillis() - timestamp)); } else { throw new Exception("Can''t support SAXSource or SAXResult"); } }
XALAN_TRANSFORM_FACTORY рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ SAXON_TRANSFORM_FACTORY рдХреА рдЬрдЧрд╣, рдЖрдк рдПрдХ XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ (рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛), рдореБрдЭреЗ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕реИрдХреНрд╕рди-рдПрдЪрдИ рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛ред рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, TransformerFactory.newInstance () рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдиреЗ рдХрдИ рдорд┐рдирдЯреЛрдВ рддрдХ рдХрд╛рдо рдХрд┐рдпрд╛! рдЗрд╕реА рд╕рдордп, рд╕реАрдкреАрдпреВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреЛрдб (рдбрд┐рдмрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдЬрдЬ) рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп SHA-2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рдерд╛ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрдбрд╝реЛрд╕реА рд╢рд╛рдЦрд╛ рдХрд╛ рдПрдХ рдкреВрд░реНрд╡
рд╕рдВрд╕реНрдХрд░рдг рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЕрдВрддрд┐рдо рддрд╕реНрд╡реАрд░реЗрдВ рд╣реИрдВ:
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐, рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ, рджреЛрдиреЛрдВ XSLT рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, XSLT 2.0 рдпрд╛ XSLT 3.0 рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп Saxon рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рднреА рд╕реНрд░реЛрддреЛрдВ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣,
GitHub рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЛ рдорджрдж рдХреА,
рдЙрд╕рдХреЗ рд▓рд┐рдП рдореИрдВ
jonic рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред