1

我想从 XML 文件中删除所有命名空间并找到我的解决方案,如下所示:

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

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

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

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>

</xsl:stylesheet>

如何在此 xslt 中使用此 XML 进行其他编辑操作(创建新标签、搜索节点),只需将新的 xslt 代码添加到前面的示例中?我不想创建两个 xslt 文件,用一个删除命名空间并用另一个 xslt 文件进行编辑操作。

编辑。例如,我有这个 xml 源:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
       <ns2:completeProductionPlan xmlns="http://ServiceManagement/OIS_Services_v01.00/common"
            xmlns:ns2="http://ServiceManagement/TechnicalOrderManagement/ProductionFulfillment_v01.00/types">
        <ns2:messageID>
            <value>9133235059913398501_9133235059913398860</value>
        </ns2:messageID>
    </ns2:completeProductionPlan>
    </soapenv:Body>
    </soapenv:Envelope>

并想得到这个:

<?xml version="1.0" encoding="UTF-8"?>
<CompletePP >
<MessageId>9133235059913398501_9133235059913398860</MessageId>
</CompletePP> 

以及我想在一个 xslt 文件中执行的所有 xslt 操作

4

2 回答 2

1

你可以做任何你喜欢的 xslt 操作。只认为您必须注意的是,您的原始xml中的名称空间uris。您必须为要访问 xslt 的元素名称添加名称空间前缀。前缀的名称可以与 xml 不同,但如果使用相同的名称会更容易阅读。这里是一个小例子。
输入xml:

<?xml version="1.0"?>
<xml xmlns:ns0="uri:test">
<ns0:Testing>
    <ns0:Cedent>
        <ns0:Party>
            <ns0:Id Agency=""></ns0:Id>
            <ns0:Name>Canada</ns0:Name>
        </ns0:Party>
    </ns0:Cedent>
    <ns0:Broker>
        <ns0:Party>
            <ns0:Id Agency="Legacy">292320710</ns0:Id>
            <ns0:Name>Spain</ns0:Name>
        </ns0:Party>
    </ns0:Broker>
</ns0:Testing>
</xml>

几乎没有更改样式表以将 Party 重命名为 test,并且输出中没有名称空间。尝试:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:t="uri:test" 
                exclude-result-prefixes="t" >

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

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

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>
    <xsl:template match="t:Party">
        <test>
            <xsl:apply-templates select="@* | node()"/>
        </test>

    </xsl:template>

</xsl:stylesheet>

这将生成以下输出:

<Testing>
    <Cedent>
        <test>
            <Id Agency=""/>
            <Name>Canada</Name>
        </test>
    </Cedent>
    <Broker>
        <test>
            <Id Agency="Legacy">292320710</Id>
            <Name>Spain</Name>
        </test>
    </Broker>
</Testing>
</xml>

由于问题更新而更新:对于您的示例,请尝试以下操作:

xmlns:common="http://ServiceManagement/OIS_Services_v01.00/common"
                exclude-result-prefixes="ns2 common" >

    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes"/>

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

    <!-- template to copy attributes -->
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <!-- template to copy the rest of the nodes -->
    <xsl:template match="comment() | text() | processing-instruction()">
        <xsl:copy/>
    </xsl:template>
    <xsl:template match="/">
        <CompletePP>
            <MessageId>
                <xsl:apply-templates select="//ns2:messageID/common:value"/>
            </MessageId>

        </CompletePP>

    </xsl:template>

</xsl:stylesheet>

这将生成以下输出:

<CompletePP>
  <MessageId>
    <value>9133235059913398501_9133235059913398860</value>
  </MessageId>
</CompletePP>

由于评论而更新:我无法访问某些元素(例如值),因为这些元素没有任何命名空间

看来还是有一点小误会。例如 value 的命名空间xmlns="http://ServiceManagement/OIS_Services_v01.00/common"因为这是 value 上下文的默认命名空间。这意味着 value 具有名称空间但没有名称空间前缀。在 xslt 中,您需要为任何具有命名空间的元素使用命名空间前缀。或者您必须使用本地名称()。

于 2013-05-17T09:03:39.987 回答
0

在您的示例中,您根本没有删除命名空间。您正在完全更改 XML。这将在这种情况下工作:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns2="http://ServiceManagement/TechnicalOrderManagement/ProductionFulfillment_v01.00/types"
    exclude-result-prefixes="ns2">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="ns2:completeProductionPlan">
    <CompletePP>
      <xsl:apply-templates />
    </CompletePP>
  </xsl:template>

  <xsl:template match="ns2:messageID">
    <MessageId>
      <xsl:apply-templates />
    </MessageId>
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,结果是:

<?xml version="1.0" encoding="utf-8"?>
<CompletePP>
  <MessageId>9133235059913398501_9133235059913398860</MessageId>
</CompletePP>

要处理您在此处的评论中发布的示例,它将是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns2="http://ServiceManagement/types"
    exclude-result-prefixes="ns2">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="ns2:completeProductionPlan">
    <CompletePP>
      <xsl:apply-templates />
    </CompletePP>
  </xsl:template>

  <xsl:template match="ns2:messageID">
    <MessageId>
      <xsl:value-of select="." />
    </MessageId>
  </xsl:template>

  <xsl:template match="text()" />
</xsl:stylesheet>
于 2013-05-17T09:34:48.703 回答