在Xquery 3.1中,我正在将XML文件(包含最初存储在SQL表中的数据)转换为另一种XML文件格式。通常,这非常简单,但是对于一个特定元素,我想将text()
以及任何child
节点及其各自的内容复制到一个新元素中。例如,我要转换以下XML:
<table tablename="collections">
<record id="1">
<field fieldname="id">1</field>
<field fieldname="title">Quisque elementum cursus nunc non aliquam</field>
<field fieldname="desc">Quisque elementum cursus nunc non aliquam;
also known under the title <i>Lorem ipsum dolor sit amet</i>.<br/> The
same author compiled a large encyclopedia <i>Liber de natura
rerum,</i> synthesizing much knowledge from his period.</field>
<field fieldname="author">Thomas de Cantimpré</field>
</record>
</table>
进入:
<list xml:id="collections">
<item n="1">
<list>
<item type="title">Quisque elementum cursus nunc non aliquam</item>
<item type="desc">Quisque elementum cursus nunc non aliquam;
also known under the title <i>Lorem ipsum dolor sit amet</i>.<br/> The
same author compiled a large encyclopedia <i>Liber de natura
rerum,</i> synthesizing much knowledge from his period.</item>
<item type="author">Thomas de Cantimpré</item>
</list>
</item>
</list>
通常,这大部分都不会造成问题。但是,我对在元素text()
中获取child
和所有<field fieldname="desc">
节点的问题感到困惑。 XPATH的解决方案让我望而却步。
预先感谢您的任何建议。
答案 0 :(得分:3)
您对“所有内容”的口头描述将是XPath术语中的所有子节点,并且文本节点当然也是元素的子节点,就像子元素是子节点一样。要选择容器节点的所有子节点,您只需要在容器节点的上下文中使用node()
,例如/table/record/field[@fieldname="desc"]/node()
选择输入样本的field fieldname="title"
元素的所有子节点。