gpt4 book ai didi

xml - 提取具有不带前缀的命名空间的节点的值

转载 作者:行者123 更新时间:2023-12-03 16:20:14 25 4
gpt4 key购买 nike

我有以下 xml 文件:

<root_tag>
<tag1>
<tag1_1>A</tag1_1>
<tag1_2>B</tag1_2>
<tag1_3>C</tag1_3>
</tag1>
<tag2>
<tag2_1>D</tag2_1>
<tag2_2>
<elem xmlns="http://a.b.com/sample">
<elem_1>E</elem_1>
<elem_2>F</elem_2>
</elem>
</tag2_2>
</tag2></root_tag>

和 xslt 模板:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<NODE>
<node1>
<xsl:value-of select="/root_tag/tag1/tag1_2"/>
</node1>
<node2>
<xsl:value-of select="/root_tag/tag2/tag2_1"/>
</node2>
<node3>
<xsl:value-of select="/root_tag/tag2/tag2_2/child::*[local-name(.) = 'elem']/child::*[local-name(.) = 'elem_1']"/>
</node3>
<xsl:variable name="A" select="namespace-uri(/root_tag/tag2/tag2_2/child::*[local-name(.) = 'elem'])"/>
<node4>
<xsl:value-of select="$A"/>
</node4>
<node5>
<!-- some code here -->
</node5>
</NODE>
</xsl:template>

输出是:
<NODE>
<node1>B</node1>
<node2>D</node2>
<node3>E</node3>
<node4>http://a.b.com/sample</node4>
<node5></node5>
</NODE>

有没有办法在 node5 中获取/root_tag/tag2/tag2_2/elem/elem_1 的值而不使用像 node3 中的 xpath?可以以某种方式使用存储 elem 命名空间的变量 A 吗?

我还设法通过在 xsl:stylesheet 标签中添加 xmlns:a_1="http://abcom/sample"并使用 xpath/root_tag/tag2/tag2_2/a_1:elem/a_1:elem_1 来提取信息,但这仅涵盖我提前知道命名空间的情况。

最佳答案

这是在 XSLT 1.0 中使用 xxx:node-set() 执行此操作的一种方法分机 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="vrtfDoc2">
<xsl:apply-templates/>
</xsl:variable>

<xsl:template match="/">
<node5>
<xsl:value-of select=
"ext:node-set($vrtfDoc2)/root_tag/tag2/tag2_2/elem/elem_1"/>
</node5>
</xsl:template>

<xsl:template match="*">
<xsl:element name="{name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:
<root_tag>
<tag1>
<tag1_1>A</tag1_1>
<tag1_2>B</tag1_2>
<tag1_3>C</tag1_3>
</tag1>
<tag2>
<tag2_1>D</tag2_1>
<tag2_2>
<elem xmlns="http://a.b.com/sample">
<elem_1>E</elem_1>
<elem_2>F</elem_2>
</elem>
</tag2_2>
</tag2>
</root_tag>

产生了想要的正确结果( node5 ):
<node5>E</node5>

说明 :
  • 这是一个两遍的变换。
  • 在 pass1 中,文档被转换为包含原始文档元素的 RTF(结果树片段),但所有元素都在“无命名空间”中。
  • EXSLT ext:node-set()扩展函数用于将上述1.中得到的RTF转换为正则树。
  • 提供的 XPath 表达式不包含任何谓词和对 local-name() 的引用函数,根据上面 3. 中生成的文档进行评估。
  • 关于xml - 提取具有不带前缀的命名空间的节点的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13186862/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com