【问题标题】:how to COPY Attribute value in a new attribute如何在新属性中复制属性值
【发布时间】:2010-04-09 06:42:12
【问题描述】:

如何将属性的数据复制到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 来做到这一点

【问题讨论】:

  • 我不想使用 xslt

标签: xml xpath xquery sqlxml


【解决方案1】:

我不确定我在第二个结果中是否完全符合您的要求,但我会尝试一下:下面的第一个示例将产生您的结果 #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>

希望对您有所帮助。

【讨论】:

  • 我只想通过 SQL XML Xquery 来做到这一点
【解决方案2】:

假设我们可以使用 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,请将 &lt;xsl:template match="child"&gt; 替换为以下内容:

<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>

【讨论】:

  • 我只想通过 SQL XML Xquery 来做到这一点
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2021-02-20
    • 1970-01-01
    • 2020-10-24
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多