используя обозначение «/ ..» в XSLT XPath - PullRequest
5 голосов
/ 05 октября 2011

Вот вопрос новичка. Что означает это выражение XPath /..? Всегда ли выбирается пустой набор узлов?

Я заметил, что этот шаблон широко используется в библиотеке FXSL , например:

<xsl:template name="map">
  <xsl:param name="pFun" select="/.."/>
  <xsl:param name="pList1" select="/.."/>

  <xsl:for-each select="$pList1">
    <xsl:copy>
      <xsl:apply-templates select="$pFun">
        <xsl:with-param name="arg1" select="."/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:for-each>
</xsl:template>

Необходимо ли указывать /.. в значениях параметров здесь?

Ответы [ 3 ]

5 голосов
/ 05 октября 2011

Цель :

 <xsl:param name="pFun" select="/.."/> 

указывает (по крайней мере, в XPath 1.0, система типов которого очень слаба), что тип параметра $pFun является узлом (или, более обычно, набором узлов). Таким образом, читатель знает, что значение, передаваемое для этого параметра, не должно быть строкой или целым числом.

Он также указывает, что значением по умолчанию, если этот параметр не был явно указан при вызове или применении шаблона, является пустой набор узлов.

Эта нотация имеет в первую очередь значимость документации (но см. Обновление в конце этого ответа) и полезна только в XPath 1.0, где система типов слаба. В XPath 2.0 рекомендуется явно указывать тип, чтобы процессор XPath мог лучше выполнять проверку типов, а сгенерированный код мог быть более оптимизированным и эффективным.

Таким образом, в XPath 2.0 / XSLT 2.0 (в данном конкретном случае) было бы лучше выполнить рефакторинг вышеприведенного:

 <xsl:param name="pFun" as="element()"> 

Существуют и другие варианты таких обозначений. В ранних книгах @Michael Kay также можно найти такие выражения, как:

@comment()

Обновление : выражение /.. имеет более практическое применение, чем простое использование в целях документирования.

<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:param name="pNode"/>
     <xsl:copy-of select=".|$pNode"/>
 </xsl:template>
</xsl:stylesheet>

Попробуйте применить это преобразование к любому документу XML. В нашем случае самый простой из возможных :

<t/>

В результате получается следующее сообщение об ошибке Saxon (аналогичная ошибка с другими процессорами XSLT 1.0):

Error at xsl:copy-of on line 8 of file:/(Untitled):
  The value is not a node-set
Transformation failed: Run-time errors were reported

Теперь замените :

  <xsl:param name="pNode"/>

с

  <xsl:param name="pNode" select="/.."/>

и снова запустите преобразование .

На этот раз преобразование выполняется без ошибки времени выполнения.

Заключение : Возможность указать пустой набор узлов важна на практике, и выражение /.. является одним из способов достижения этого.

2 голосов
/ 05 октября 2011

Выражение /.. выбирает родителя корневого узла, который гарантированно ничего не выберет.

/ относится к корневому узлу документа XML, который действительно является абстрактным понятием для верхнего уровня документа и используется в XPath в качестве отправной точки для ссылки на элементы верхнего уровня. Его потомки всегда будут включать элемент документа, а также могут включать в себя элементы верхнего уровня comment() и processing-instruction(), которые являются родственными элементами элемента документа.

Нужно ли указывать / .. в значениях параметров здесь?

Нет, необязательно предоставлять оператор выбора по умолчанию для xsl:param. В этом случае он используется для явного определения значения по умолчанию для этих параметров как «ничего».

0 голосов
/ 05 октября 2011

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

Это не имеет смысла.

Если это не должно быть ./..: т.е.родитель текущего (контекстного) узла.

...