1

XSLT は、スクリプトまたはその他の方法で、次のいずれかの存在を検出できますか。

"http://..."

また

<a>"http..."</a> 

メッセージ フィールド内に配置し、リンクとしてスタイル設定します。私は最悪の事態に備えています!

4

1 に答える 1

0

XPath 2.0は、RegEx処理の貴重な機能を提供します。XSLT 2.0以降でこれを使用すると、次のように記述できます

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vurlRegex"
 >(http|https|ftp|mailto)://(\p{L}+\.)+\p{L}+(/\p{L}([./?%&amp;=])*)?</xsl:variable>

 <xsl:template match="/*/*[not(matches(.,$vurlRegex))]">
  <xsl:sequence select='"Warning:", ., " isn&apos;t a valid Uri&#xA;"'/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合:

<t>
 <a>http://abc.com</a>
 <b>\`\```^^^</b>
</t>

必要な正しい結果が生成されます:

Warning:<b>\`\```^^^</b> isn't a valid Uri

注意してください

使用される正規表現は、URLを照合するために最も正確ではない場合があります。これを、より適切でより正確なものに置き換えることができます。


次を使用して、この便利な字句チェックをより再利用可能な形式で表現できxsl:functionます。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vurlRegex"
 >(http|https|ftp|mailto)://(\p{L}+\.)+\p{L}+(/\p{L}([./?%&amp;=])*)?</xsl:variable>

 <xsl:template match="/*/*[not(my:IsValidUrl(.))]">
  <xsl:sequence select='"Warning:", ., " isn&apos;t a valid Uri&#xA;"'/>
 </xsl:template>

 <xsl:template match="text()"/>

 <xsl:function name="my:IsValidUrl" as="xs:boolean">
  <xsl:param name="pStr" as="xs:string"/>

  <xsl:sequence select="matches($pStr, $vurlRegex)"/>
 </xsl:function>
</xsl:stylesheet>

更新

ここでは、Michael Kayがコメントで提供した式の参照を使用しています。これは、XSD仕様とは別に、XSDワーキンググループによって公開されたW3Cノートからのものです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vurlRegex"
 >((([A-Za-z])[A-Za-z0-9+\-\.]*)
   :((//(((([A-Za-z0-9\-\._~!$&amp;'()*+,;=:]|(%[0-9A-Fa-f][0-9A-Fa-f]))*@))?
   ((\[(((((([0-9A-Fa-f]){0,4}:)){6}((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})
   |(([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])
   |(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])
   |(25[0-5])))))
   |(::((([0-9A-Fa-f]){0,4}:)){5}((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})
   |(([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5])))))
   |((([0-9A-Fa-f]){0,4})?::((([0-9A-Fa-f]){0,4}:)){4}((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})
   |(([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]
   |([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])
   |(25[0-5])))))|(((((([0-9A-Fa-f]){0,4}:))?([0-9A-Fa-f]){0,4}))?::((([0-9A-Fa-f]){0,4}:)){3}((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})
   |(([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]
   |([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5])))))|(((((([0-9A-Fa-f]){0,4}:)){0,2}([0-9A-Fa-f]){0,4}))?
   ::((([0-9A-Fa-f]){0,4}:)){2}((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})|
   (([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|
   ([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5])))))|(((((([0-9A-Fa-f]){0,4}:)){0,3}([0-9A-Fa-f]){0,4}))
   ?::([0-9A-Fa-f]){0,4}:((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})|(([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])
   |(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5])))))
   |(((((([0-9A-Fa-f]){0,4}:)){0,4}([0-9A-Fa-f]){0,4}))?::((([0-9A-Fa-f]){0,4}:([0-9A-Fa-f]){0,4})
   |(([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})
   |(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]
   |([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5])))))
   |(((((([0-9A-Fa-f]){0,4}:)){0,5}([0-9A-Fa-f]){0,4}))?::([0-9A-Fa-f]){0,4})
   |(((((([0-9A-Fa-f]){0,4}:)){0,6}([0-9A-Fa-f]){0,4}))?::))|(v([0-9A-Fa-f])+\.(([A-Za-z0-9\-\._~]
   |[!$&amp;'()*+,;=]|:))+))\])|(([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])
   |(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]|([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5]))\.([0-9]
   |([1-9][0-9])|(1([0-9]){2})|(2[0-4][0-9])|(25[0-5])))|(([A-Za-z0-9\-\._~]|(%[0-9A-Fa-f][0-9A-Fa-f])
   |[!$&amp;'()*+,;=]))*)((:([0-9])*))?)((/(([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f])))*))*)
   |(/(((([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f])))+((/(([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f])))*))*))?)
   |((([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f])))+((/(([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f])))*))*)
   |)((\?((([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f]))|/
   |\?))*))?((#((([A-Za-z0-9\-\._~!$&amp;'()*+,;=:@]|(%[0-9A-Fa-f][0-9A-Fa-f]))|/|\?))*))?)</xsl:variable>

 <xsl:template match="/*/*[not(my:IsValidUrl(.))]">
  <xsl:sequence select='"Warning:", ., " isn&apos;t a valid Uri&#xA;"'/>
 </xsl:template>

 <xsl:template match="text()"/>

 <xsl:function name="my:IsValidUrl" as="xs:boolean">
  <xsl:param name="pStr" as="xs:string"/>

  <xsl:sequence select="matches($pStr, $vurlRegex, 'x')"/>
 </xsl:function>
</xsl:stylesheet>
于 2013-03-08T04:19:12.943 に答える