Как написать xpath для выбора узла, текст которого содержит специальные символы, такие как апостороф? - PullRequest
3 голосов
/ 20 января 2012

Как написать xpath для выбора узла, текст которого содержит специальные символы, такие как ', который является недопустимым типом inxpath?

<Nodes><Node><Text>General Marketing'</Text><Nodes><Node><Text>Brochures</Text></Node><Node><Text>Value-Added</Text><Nodes><Node><Text>About Henderson</Text></Node><Node><Text>Own the World</Text></Node></Nodes></Node></Nodes></Node></Nodes>

и

var branchName = "General Marketing'";
var xPath = String.Format("/Nodes/Node[Text = '{0}']", branchName);

вышеупомянутый xpath завершается ошибкойпотому что xPath содержит следующий текст:

/Nodes/Node[Text = 'General Marketing''] 

Как вы можете видеть, есть 2 апосторофа.

Из моих тестов до сих пор он имел проблему только с '.Не уверен, есть ли какие-либо другие специальные символы, с которыми он может иметь проблемы?

Так что я думаю, что мне нужно изменить xpath, чтобы он был другим.

Я попробовал следующее, но нене работает:

var xPath = String.Format("/Nodes/Node[Text = \"{0}\"]", branchName);

Надеюсь, вопрос ясен.

Спасибо,

1 Ответ

3 голосов
/ 20 января 2012

Использование :

//Text[.="General Marketing'"]

Если это выражение XPath используется в XSLT, тогда все выражение XPath может быть заключено в апострофы, а последний символ (апостроф) строки в окружениикавычки должны быть экранированы с использованием встроенной сущности &apos;:

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

 <xsl:template match="/">
  <xsl:copy-of select='//Text[.="General Marketing&apos;"]'/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML :

<Nodes>
    <Node>
        <Text>General Marketing'</Text>
        <Nodes>
            <Node>
                <Text>Brochures</Text>
            </Node>
            <Node>
                <Text>Value-Added</Text>
                <Nodes>
                    <Node>
                        <Text>About Henderson</Text>
                    </Node>
                    <Node>
                        <Text>Own the World</Text>
                    </Node>
                </Nodes>
            </Node>
        </Nodes>
    </Node>
</Nodes>

требуемый элемент выбирается и копируется в вывод :

<Text>General Marketing'</Text>

Это проще, чем другие подходы, такие как:

//Text[. = concat('General Marketing', $vQ)]

, где переменная $vQопределяется как:

<xsl:variable name="vQ">'</xsl:variable>
...