XSL 在 XML 中无法使用不同的命名空间

XSL not working with different namespace in XML

提问人:CMarcera 提问时间:8/11/2022 最后编辑:CMarcera 更新时间:8/11/2022 访问量:71

问:

我正在迁移 XSL 转换,但新的 XML 输入不再具有 XML 命名空间。

下面的 XSL 曾经输出“测试标题”,但现在不生成任何内容。

旧 XML:

<article xmlns:as="http://www.company.com/schemas/articleschema">
  <parastyles>
    <parastyle name="Body Copy" uid="292"/>
    <parastyle name="Headline Regular" uid="311"/>
  </parastyles>
  <charstyles>
    <charstyle name="Character Style 1" uid="285"/>
  </charstyles>
  <story name="head">
    <runs>
      <run p="311" c="285">Test Headline</run>
    </runs>
  </story>
  <story name="body">
    <runs>
      <run p="292" c="285">
        <eol hyphenated="true"/>Met facipsam lam sinti do<eol/>lorendae dem endae lita sim
        <eol hyphenated="true"/>fuga. Nam, ut que venda es si<eol/>tame nimin con ex exerisque
      </run>
    </runs>
  </story>
</article>

新 XML:

<article xmlns="http://www.company.com/schemas/articleschema">
  <parastyles>
    <parastyle name="Body Copy" uid="292"/>
    <parastyle name="Headline Regular" uid="311"/>
  </parastyles>
  <charstyles>
    <charstyle name="Character Style 1" uid="285"/>
  </charstyles>
  <story name="head">
    <runs>
      <run p="311" c="285">Test Headline</run>
    </runs>
  </story>
  <story name="body">
    <runs>
      <run p="292" c="285">
        <eol hyphenated="true"/>Met facipsam lam sinti do<eol/>lorendae dem endae lita sim
        <eol hyphenated="true"/>fuga. Nam, ut que venda es si<eol/>tame nimin con ex exerisque
      </run>
    </runs>
  </story>
</article>

唯一的区别是命名空间的变化:xmlns:as

这是我的XSL,它适用于旧XML但不适用于新XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:apply-templates select="//story[@name='head']"/>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>
    <xsl:template match="eol[@hyphenated]">
        <xsl:text></xsl:text>
    </xsl:template>
    <xsl:template match="eol">
        <xsl:text> </xsl:text>
    </xsl:template>
</xsl:stylesheet>

我敢肯定这是一件非常简单的事情,但我对命名空间不够熟悉,无法弄清楚。提前致谢!

更新 -- XSL 解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:as="http://www.company.com/schemas/articleschema"
exclude-result-prefixes="as">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:apply-templates select="//as:story[@name='head']"/>
    </xsl:template>
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>
    <xsl:template match="eol[@hyphenated]">
        <xsl:text></xsl:text>
    </xsl:template>
    <xsl:template match="eol">
        <xsl:text> </xsl:text>
    </xsl:template>
</xsl:stylesheet>
XML XSLT 命名空间

评论

2赞 michael.hor257k 8/11/2022
“唯一的区别是命名空间的变化:xmlns:as”这是一个主要区别,因为它将 XML 中的所有元素都放在声明的命名空间内(以前,命名空间声明是多余的,因为没有带有前缀的元素)。请参阅此处如何进行:stackoverflow.com/a/34762628/3016153as
0赞 CMarcera 8/11/2022
按照您的示例,我能够拼凑出有效的 XSL,并在 OP 中更新。虽然老实说我不明白为什么 XSL 在原始示例中添加了命名空间“as”,但如果没有命名空间就无法工作。似乎我必须将一个不存在的命名空间添加到我的新 XSL 并包含它?无论如何,它正在工作,所以我感谢你:)只是希望我明白为什么......
0赞 michael.hor257k 8/11/2022
正如我已经提到的,您的原始 XSLT 使用旧的 XML,因为旧 XML 中的命名空间声明没有执行任何操作。你可以删除它,什么都不会改变。只有当有一个名为 的元素时,它才会有效果。--- 另请注意,您的 2 个模板匹配也不会执行任何操作,因为没有模板应用于元素。如果您确实将模板应用于它们并希望它们生效,则还需要在匹配模式中使用前缀。as:somethingeoleolas

答: 暂无答案