gpt4 book ai didi

xml - 使用 XSL 根据 XML 的条件添加命名空间

转载 作者:行者123 更新时间:2023-12-04 17:01:47 25 4
gpt4 key购买 nike

我正在尝试根据条件向 xml 添加命名空间。但条件不起作用。有人可以帮忙吗。

输入 XML:

                    <n0:MainTag xmlns:n0='http://abc123.com' xmlns:prx='urn:testing.com' xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'>
<header>M</header>
<Data>
<Child>623471568753</Child>

</Data>
</n0:MainTag>

输出 XML:
                    <?xml version="1.0" encoding="UTF-8"?>
<ns0:MainTag xmlns:ns0="http://xyz987.com">
<header>M</header>
<Data>
<Child>623471568753</Child>
</Data>
</n0:MainTag>

第二个输入:
输入 XML:
                <n0:DifferentTag xmlns:n0='http://abc123.com' xmlns:prx='urn:testing.com' xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'>
<header>M</header>
<Datum>
<Child>Test123</Child>

</Datum>
</n0:DifferentTag>

输出 XML:
                <n0:DifferentTag xmlns:ns0="http://QWR.com">
<header>M</header>
<Datum>
<Child>Test123</Child>

</Datum>
</n0:DifferentTag>

XSL 尝试过:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://xyz987.com">
<xsl:output encoding='UTF-8' indent='yes' method='xml'/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="MainTag">
<xsl:element name="ns0:{local-name()}" namespace="http://xyz987.com">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

<xsl:template match="MainTag">
<xsl:element name="ns0:{local-name()}" namespace="http://QWR.com">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

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

条件:检查源 XML 中的标记名称

最佳答案

问题是在您输入的 XML 中,MainTagDifferentTag位于“http://abc123.com”中,但您在 XSLT 中考虑到了这一点,因此它试图匹配没有命名空间的标签。

您需要在 XSLT 中声明前缀,并在匹配中使用它。

另请注意,您当前的 XSLT 有两个模板匹配 MainTag , 什么时候应该匹配 DifferentTag .

试试这个 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:n0="http://abc123.com"
exclude-result-prefixes="n0">
<xsl:output encoding='UTF-8' indent='yes' method='xml'/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="n0:MainTag">
<xsl:element name="ns0:{local-name()}" namespace="http://xyz987.com">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

<xsl:template match="n0:DifferentTag">
<xsl:element name="ns0:{local-name()}" namespace="http://QWR.com">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

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

编辑:如果您真的不知道输入 XML 中的 namespace ,请尝试使用此 XSLT...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output encoding='UTF-8' indent='yes' method='xml'/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="*[local-name() = 'MainTag']">
<xsl:element name="ns0:{local-name()}" namespace="http://xyz987.com">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

<xsl:template match="*[local-name() = 'DifferentTag']">
<xsl:element name="ns0:{local-name()}" namespace="http://QWR.com">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

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

关于xml - 使用 XSL 根据 XML 的条件添加命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52551384/

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