2016-04-21 4 views
0

У меня есть XML, как следует,XSLT - проверить узел является не существует или с помощью функции

<doc> 
    <meta-data> 
     <paper-name>ABC</paper-name> 
     <paper-type>fi</paper-type> 
    </meta-data> 

    <section> 
     <figure>fig1</figure> 
     <figure>fig2</figure> 
    </section> 
</doc> 

Мое требование, если <paper-type> узел доступен в <meta-data> изменения <figure> узлов в <image> узел.

Таким образом, вывод должен выглядеть,

<doc> 
    <meta-data> 
     <paper-name>ABC</paper-name> 
     <paper-type>fi</paper-type> 
    </meta-data> 

    <section> 
     <image>fig1</image> 
     <image>fig2</image> 
    </section> 
</doc> 

Я написал следующее XSL для выполнения этой задачи,

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

    <xsl:function name="abc:check-paper-type" as="xs:boolean"> 
     <xsl:sequence select="root()//meta-data/paper-type"/> 
    </xsl:function> 

    <xsl:template match="figure[abc:check-paper-type()]"> 
     <image> 
      <xsl:apply-templates/> 
     </image> 
    </xsl:template> 

проверить <paper-type> узел доступен в <meta-data> Я написал функцию здесь по имени «чек-бумага типа. но работает не так, как ожидалось.

Любое предложение, как я могу организовать свою функцию для проверки, <paper-type> имеется или нет?

Обратите внимание, что мне нужно изменить множество узлов, установив <paper-type> узел или нет. Таким образом, будет важно проверить, существует или нет <paper-type> с помощью функции.

ответ

1

Причина, почему ваша попытка не может работать так:

В теле функции таблицы стилей, фокус первоначально не определен; это означает, что любая попытка ссылки на контекстный элемент, контекстная позиция или размер контекста является динамической ошибкой, не подлежащей восстановлению. [XPDY0002]

http://www.w3.org/TR/xslt20/#stylesheet-functions

Вы могли бы сделать просто:

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

<xsl:template match="figure[../../meta-data/paper-type]"> 
    <image> 
     <xsl:apply-templates select="@*|node()"/> 
    </image> 
</xsl:template> 

Учитывая ваш вклад, это будет производить:

<?xml version="1.0" encoding="UTF-8"?> 
<doc> 
    <meta-data> 
     <paper-name>ABC</paper-name> 
     <paper-type>fi</paper-type> 
    </meta-data> 
    <section> 
     <image>fig1</image> 
     <image>fig2</image> 
    </section> 
</doc> 

В качестве альтернативы, если вам нужно ссылаться на существующие ENCE узла несколько раз, вы можете определить его как переменной вместо функции:

<xsl:variable name="check-paper-type" select="exists(/doc/meta-data/paper-type)" /> 

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

<xsl:template match="figure[$check-paper-type]"> 
    <image> 
     <xsl:apply-templates select="@*|node()"/> 
    </image> 
</xsl:template> 
+0

это пример кода, и мне нужно изменить множество имен узлов, проверяя узел будет существовать или не. Таким образом, это будет более эффективно, если я могу использовать функцию для проверки наличия или нет. Приношу свои извинения за отсутствие деталей в оригинальном вопросе. – sanjay

+0

Посмотрите, поможет ли отредактированный ответ. –

Смежные вопросы