Это невозможно с xpath? - PullRequest
2 голосов
/ 05 июля 2010

Можно ли с помощью xpath каким-то образом преобразовать результат, точно так же, как это можно сделать с помощью SQL?

Учитывая следующее:

<a>
  <b x="1" y="2" z="3">
  <b x="2" y="2" z="3">
</a>

Например, если я хочу получить все узлы b, но я не хочу, чтобы атрибут z был частью результатов.

Или еще одна вещь, о которой я думаю, - это получить все y узлы, умноженные на коэффициент, подобный этому / a / b [(@ y * 2)], что кажется невозможным, по крайней мере, я не знаю как написать это.

Ответы [ 3 ]

3 голосов
/ 05 июля 2010

Как указано в ответе @svick, выражение XPath может выбирать набор узлов из XML-документов, но не может изменять XML-документ (ы) или создавать новый документ (ы).

Вот преобразование XSLT, которое создает новый XML-документ, в котором атрибуты z опущены, а атрибуты y умножены на 2.

<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="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="@z"/>

 <xsl:template match="@y">
   <xsl:attribute name="y">
     <xsl:value-of select="2* ."/>
   </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

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

<a>
  <b x="1" y="2" z="3"/>
  <b x="2" y="2" z="3"/>
</a>

желаемый, правильный результат получен :

<a>
   <b x="1" y="4"/>
   <b x="2" y="4"/>
</a>

Простота и мощь этого решения обусловлены использованием одного из самых мощных шаблонов проектирования XSLT: использование правила идентификации и его переопределения с конкретными шаблонами только для узлов, которые должны обрабатываться определенным образом.

2 голосов
/ 05 июля 2010

Нет, в XPath вы можете выбрать только некоторые узлы в документе. Для этого вы можете использовать XQuery (который является надмножеством XPath) или XSLT.

1 голос
/ 05 июля 2010

С помощью xslt вы можете использовать xsl: element, чтобы определять новые элементы, используя старые, или добавлять атрибуты, используя xsl: attribute.

Используйте их для генерации элементов так, как вы хотите, из набора результатов xpath.

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