当前位置: 首页 > 知识库问答 >
问题:

XSLT转换选择元素不适用于默认命名空间[重复]

苏弘盛
2023-03-14

我有以下XML示例

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:com:ssn:schema:export:SSNExportFormat.xsd" Version="0.1" DocumentID="7bf15843-4fe7-4692-b638-b42ada6b86f6-2" ExportID="7bf15843-4fe7-4692-b638-b42ada6b86f6" JobID="132251" RunID="7238837" CreationTime="2017-03-09T04:00:08.209+13:00" StartTime="2017-03-08T01:00:00.000+13:00" EndTime="2017-03-09T01:00:00.000+13:00">
  <product product-id="clothes">
  <items>
    <item item-name="TShirt" size="L">Brown</item>
    <item item-name="Pants" size="L">Green</item>
    <item item-name="Shirt" size="L">White</item>
  </items>
</product>
<product product-id="toys">
  <items>
    <item item-name="Ball" size="L">Cyan</item>
    <item item-name="Bat" size="L">Green</item>
    <item item-name="Racket" size="L">Blue</item>
  </items>
  </product>
</catalog>

标准是只复制“item-name”属性值为TShert、Ball和Bat的位置(即:还有更多元素,但我们只使用白名单)。生成的XML应该像

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:com:ssn:schema:export:SSNExportFormat.xsd" Version="0.1" DocumentID="7bf15843-4fe7-4692-b638-b42ada6b86f6-2" ExportID="7bf15843-4fe7-4692-b638-b42ada6b86f6" JobID="132251" RunID="7238837" CreationTime="2017-03-09T04:00:08.209+13:00" StartTime="2017-03-08T01:00:00.000+13:00" EndTime="2017-03-09T01:00:00.000+13:00">
<product product-id="clothes">
  <items>
    <item item-name="TShirt" size="L">Brown</item>
  </items>
</product>
<product product-id="toys">
  <items>
    <item item-name="Ball" size="L">Cyan</item>
    <item item-name="Bat" size="L">Green</item>
  </items>
</product>
</catalog>

以下XSL不起作用

<xsl:stylesheet version="1.0" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns="urn:com:ssn:schema:export:SSNExportFormat.xsd"
                xmlns:local="local">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

    <local:WhiteList>
      <item-name>TShirt</item-name>
      <item-name>Pants</item-name>
      <item-name>Ball</item-name>
    </local:WhiteList>
    <xsl:variable name="whiteList" select="document('')/*/local:WhiteList/item-name"/>

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

    <xsl:template match="item">
      <xsl:if test="@item-name=$whiteList">
        <xsl:copy-of select="."/>
      </xsl:if>    
    </xsl:template>
  </xsl:stylesheet>

如果从XML中删除了默认名称空间“urn:com:ssn:schema:export:SSNExportFormat.xsd”,则XSLT可以工作。你能帮忙吗?

共有1个答案

冀越
2023-03-14

如果输入文档具有默认名称空间,则相关样式表应使用名称空间前缀声明它。

修改后的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ssne="urn:com:ssn:schema:export:SSNExportFormat.xsd"
    xmlns:local="local">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <local:WhiteList>
        <item-name>TShirt</item-name>
        <item-name>Pants</item-name>
        <item-name>Ball</item-name>
    </local:WhiteList>

    <xsl:variable name="whiteList" select="document('')/*/local:WhiteList/item-name"/>

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

    <xsl:template match="ssne:item">
        <xsl:if test="@item-name = $whiteList">
            <xsl:copy-of select="."/>
        </xsl:if>    
    </xsl:template>
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<catalog xmlns="urn:com:ssn:schema:export:SSNExportFormat.xsd"
         Version="0.1"
         DocumentID="7bf15843-4fe7-4692-b638-b42ada6b86f6-2"
         ExportID="7bf15843-4fe7-4692-b638-b42ada6b86f6"
         JobID="132251"
         RunID="7238837"
         CreationTime="2017-03-09T04:00:08.209+13:00"
         StartTime="2017-03-08T01:00:00.000+13:00"
         EndTime="2017-03-09T01:00:00.000+13:00">
   <product product-id="clothes">
      <items>
         <item item-name="TShirt" size="L">Brown</item>
         <item item-name="Pants" size="L">Green</item>
      </items>
   </product>
   <product product-id="toys">
      <items>
         <item item-name="Ball" size="L">Cyan</item>
      </items>
   </product>
</catalog>
 类似资料:
  • XSLT示例: 这里有一个名称空间xmlns:xslnsv=”http://sample2.2“当我们有一个具有相同命名空间的xml时,它就工作了 产生输出: 但问题是:我们有一些具有不同命名空间ie的XMLhttp://sample2.1具有不同命名空间的示例xml 那么我们就没有正确的输出。 我修改了xslt以动态更改名称空间。带有新更改的xslt示例 在我看来,它可以更改名称空间,但不能在更

  • 我有这个xml是架构版本3.0http://www.test.com/Service/v3。我需要将其降级到版本1http://www.test.com/Service/v1.为此,我使用XSL来转换它。 但我得到这样的结果 在我的输出XML中,我得到了这个 为什么将其添加到NS2:消息中? 它不在输入xml中。 我遗漏了一些东西。如果有人能指出这个问题,我将不胜感激。 我希望在输出中创建以下内容

  • 我试图用XSLT处理器在PHP中转换xml文档,但我无法选择任何内容。。。我认为这是一个名称空间问题。如果我从一个干净的<代码> inputxml: Xsl-file: 我无法更改输入文件,因为它是由其他程序生成的。 安德烈

  • 我是XSLT的新手,命名空间有问题。这是我必须转换的XML: 我正在使用以下XSLT: 结果是: 我试图删除结果输入顺序中的名称空间,但它不适合我。有人能帮我学习XSLT吗?谢谢

  • 我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。 输入消息: 预期输出消息: 实际输出消息: XSLT:

  • 我需要使用默认命名空间创建/读取xml文件: 但我得到: 我知道包级元数据,但这在复杂的包结构中不起作用: 我已经定义了模型类,如Address: 客户: 公共字段的父类: 然后是保存具体xml XmlBoo的数据/结构的特定类: XmlFoo: package-info.java包括在两个提到的包example.xml.boo: 和example.xml.foo: 最后是主要方法: 我在这里尝试