2

これがXMLドキュメントの一部です。

<book category="WEB">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
</book>    

XPathを使用して、姓が大文字の「C」で始まる著者を探すように求められます。この質問では、修飾文字が1つしかないため、空白の後に関数substring-after()を使用して、それが「C」で始まるかどうかを確認できるため、簡単です。しかし、この男は非常に長い名前を持っている可能性もあるため、Kurt VanPersieCagleのようにミドルネームが表示される可能性があります。最後の空白の後の部分文字列を正確に削除するにはどうすればよいですか?

XPathの関数を説明して使用してください。

4

3 に答える 3

0

XPathを使用して、姓が大文字の「C」で始まる著者を探すように求められます。

一般に、これは単一のXPath1.0式で選択することはできません。もちろん、これはXSLT1.0を使用して実行できます。

XPath 2.0の場合

/*/author[starts-with(tokenize(., ' ')[last()], 'C')]

XSLT 2.0ベースの検証

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
     <xsl:sequence select="/*/author[starts-with(tokenize(., ' ')[last()], 'C')]"/>
 </xsl:template>
</xsl:stylesheet>

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

<book category="WEB">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt van Persy Cantor Bagle</author>
    <author>Kurt van Persy Cantor Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
</book>

XPath式が評価され、選択したノードが出力にコピーされます。

<author>Kurt van Persy Cantor Cagle</author>
于 2012-10-25T13:47:31.790 に答える
0

「混乱した」XPathを使用できます。たとえば、次の単語には4ワードの制限がありますauthor

//author[
    (starts-with(substring-after(., ' '), 'C') and not(contains(substring-after(., ' '), ' ')))
    or
    (starts-with(substring-after(substring-after(., ' '), ' '), 'C') and not(contains(substring-after(substring-after(., ' '), ' '), ' ')))
    or
    (starts-with(substring-after(substring-after(substring-after(., ' '), ' '), ' '), 'C') and not(contains(substring-after(substring-after(substring-after(., ' '), ' '), ' '), ' ')))
]

入力:

<book>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>James Linn</author>
    <author>Kurt Van Persie Cagle</author>
</book>

XPathの上では、2人の作成者が選択されます:Kurt CagleKurt Van Persie Cagle。このXPathを拡張して、5語などの作成者に一致させることができます... :)

于 2012-10-25T22:12:48.377 に答える
0

@DimitreNovatchevによる優れたソリューションのフォローアップとして、パーサーがEXSLTの文字列拡張関数を使用できる場合は、XSLT1.0で同じトークン化の概念を使用できることに注意してください。

たとえば、このEXSLT対応のXSLT1.0ソリューションは次のとおりです。

<?xml version="1.0"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:str="http://exslt.org/strings"
  exclude-result-prefixes="str"
  version="1.0">
  <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:copy-of
      select="/*/author[starts-with(str:tokenize(., ' ')[last()], 'C')]" />
  </xsl:template>

</xsl:stylesheet>

... @Dimitreの変更された入力XMLに適用すると、同じ望ましい結果が生成されます。

<author>Kurt van Persy Cantor Cagle</author>
于 2012-10-30T13:42:56.970 に答える