2012-08-02 3 views
2

Я нашел это существующее сообщение при замене значения данного элемента, но мне нужно идти дальше с моим требованием в том, что мне нужно заменить первый символ другим. Это сообщение я нашел: изменить значение элемента с помощью XQueryзаменить значение элемента на xquery

Источник XML:

<?xml version="1.0" encoding="UTF-8"?> 
<category> 
    <catid>1</catid> 
    <cattext>sport</cattext> 
</category> 

Используя этот XQUERY:

declare namespace local = "http://example.org"; 
declare function local:copy-replace($element as element()) { 
    if ($element/self::cattext) 
    then <cattext>art</cattext> 
    else element {node-name($element)} 
       {$element/@*, 
       for $child in $element/node() 
       return if ($child instance of element()) 
         then local:copy-replace($child) 
         else $child 
       } 
}; 
local:copy-replace(/*) 

Придает этот выход:

<?xml version="1.0" encoding="UTF-8"?> 
<category> 
    <catid>1</catid> 
    <cattext>art</cattext> 
</category> 

Мои знания о Xquery только j ust начинает расти. Как изменить выше XQUERY, чтобы изменить только первый символ, так что я получаю ниже вывод:

<?xml version="1.0" encoding="UTF-8"?> 
<category> 
    <catid>1</catid> 
    <cattext>9port</cattext> 
</category> 

ответ

3

Используйте substring() функция:

declare namespace local = "http://example.org"; 
declare function local:copy-replace($element as element()) { 
    if ($element/self::cattext) 
    then <cattext>9{substring($element,2)}</cattext> 
    else element {node-name($element)} 
       {$element/@*, 
       for $child in $element/node() 
       return if ($child instance of element()) 
         then local:copy-replace($child) 
         else $child 
       } 
}; 
local:copy-replace(/*) 

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

<category> 
    <catid>1</catid> 
    <cattext>sport</cattext> 
</category> 

разыскиваемых, правильный результат получается:

<category> 
    <catid>1</catid> 
    <cattext>9port</cattext> 
</category> 

То же самое преобразование гораздо проще сделать с помощью XSLT:

<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="cattext/text()"> 
    <xsl:text>9</xsl:text><xsl:value-of select="substring(., 2)"/> 
</xsl:template> 
</xsl:stylesheet> 

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

<category> 
    <catid>1</catid> 
    <cattext>9port</cattext> 
</category> 
+0

Спасибо Dimitre , Теперь, если бы я мог беспокоить вас немного больше, что бы XSLT выглядело так же, как и одно. –

+0

@TonyJ: Я добавил к этому ответу преобразование XSLT, которое дает тот же результат. Обратите внимание, насколько проще выразить преобразования с помощью XSLT. Явное повторение исчезло - это не обязательно. –

+0

Определенно легче читать и улучшать при необходимости с преобразованием XSLT. Еще раз спасибо Димитрию. –

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