как скопировать значение атрибута в новый атрибут - PullRequest
2 голосов
/ 09 апреля 2010

Как скопировать данные атрибута в новый атрибут в том же столбце в sql

исходные данные

<root>
<child attr='hello'></child>
</root>

Результат 1

<root>
<child attr='hello' attr2='hello'></child>
</root>

Результат 2 (с модификацией)

<root>
<child attr='hello' attr2='**H**ello **W**orld'></child>
</root>

Я хочу сделать это только через SQL XML Xquery

Ответы [ 3 ]

1 голос
/ 14 апреля 2010

Я не уверен, что точно следую тому, что вы хотите, во втором результате, но я попробую сделать это: первый пример ниже даст ваш результат # 1 (я поместил ваши исходные данные в test.xml и предположил в ваших реальных данных, что 'child' и 'attr' могут повторяться):

<root>{
  for $child in doc('test.xml')/root/*
  return
    element {name($child)} {
      for $attr at $index in $child/@*
      return (
        attribute {name($attr)} {$attr},
        attribute {concat(name($attr), 2)} {$attr}
      )
    }
}</root>

Его можно изменить, добавив другое значение, как в результате # 2, как показано ниже:

<root>{
  for $child in doc('test.xml')/root/*
  return
    element {name($child)} {
      for $attr at $index in $child/@*
      return (
        attribute {name($attr)} {$attr},
        attribute {concat(name($attr), 2)} {
          '**H**ello **W**orld' 
        }
      )
    }
}</root>

Надеюсь, это поможет.

0 голосов
/ 14 декабря 2015
DECLARE @xmlData table (
   data xml
   )


INSERT INTO @xmlData(data) 
VALUES ('<root>
   <child attr="hello"></child>
   </root>')

.modify() выполняет все операции

UPDATE @xmlData
SET data.modify('insert (attribute attr2 {"hello"}) into (/root/child)[1]')

Убедитесь, что данные верны

SELECT *
FROM @xmlData


UPDATE @xmlData
SET data.modify('replace value of (/root/child/@attr2)[1] with "**H**ello **W**orld" ')

Убедитесь, что данные верны

SELECT *
FROM @xmlData

enter image description here

0 голосов
/ 09 апреля 2010

Предполагая, что мы можем использовать XSLT, я бы сделал это так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" />

    <xsl:template match="root">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="child">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="attr2">
                <xsl:value-of select="@attr"/>
            </xsl:attribute>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet> 

Или, если вы хотите изменить результат 2, заменить <xsl:template match="child"> на следующее:

<xsl:template match="child">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:attribute name="attr2">
            <xsl:value-of>
                <xsl:text>**H**ello **W**orld</xsl:text>
            </xsl:value-of>
        </xsl:attribute>
    </xsl:copy>
</xsl:template>
...