Как проверить, содержит ли имя элемента конкретную строку? - PullRequest
2 голосов
/ 08 августа 2010

Исходный документ выглядит так:

<a>
 <b n=n1n1n1n1>
 <c1> drftgy </c1>
 </b>
<c2> dddd </c2>
</a>

как проверить, если имя элемента = c, тогда мы что-нибудь сделаем ...

Ответы [ 2 ]

7 голосов
/ 08 августа 2010

Используйте ряд стандартных функций XPath :

Чтобы узнать, начинается ли имя текущего узласо строкой "c" используйте:

starts-with(name(), 'c')

Чтобы узнать, содержит ли имя текущего узла строку "c", используйте:

contains(name(), 'c')

Чтобы выбрать все элементы в документе XML,чьи имена начинаются с "c", используйте:

//*[starts-with(name(), 'c')]

Чтобы выбрать все элементы в документе XML, чьи имена содержат "c", используйте:

//*[contains(name(), 'c')]

Редактировать : ОП задал дополнительный вопрос: Как выбрать все элементы, чье имя - один в наборе имен?

XPath 2.0 :

  //*[name(.)= ('c1', 'c2', 'c3')]

Thisиспользует общий оператор сравнения = и выбирает все элементы в документе, чье имя является одним из строкngs в последовательности ('c1', 'c2', 'c3').

Это невозможно сделать только с XPath 1.0,

XSLT 1.0 + XPath 1.0 :

Это преобразование :

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

 <my:names>
  <name>c1</name>
  <name>c2</name>
  <name>c3</name>
 </my:names>

 <xsl:variable name="vNames" select=
  "document('')/*/my:names/*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
  <xsl:copy-of select="//*[name()=$vNames]"/>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу (исправлено, чтобы быть правильно сформированным):

<a>
 <b n="n1n1n1n1">
 <c1> drftgy </c1>
 </b>
<c2> dddd </c2>
</a>

дает желаемый результат :

<c1> drftgy </c1>
<c2> dddd </c2>
1 голос
/ 08 августа 2010

В XPath 2.0 и XQuery 1.0 вы можете использовать //*[local-name() = ('c1', 'c2', 'c3')] или совпадения с регулярным выражением, например //*[matches(local-name(), '^c[123]$')].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...