如何从XML名称空间“选择”?如何从XML名称空间“选择”?(How to 'select&

2019-05-12 04:35发布

我有一个XML文档类似:::

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
          xmlns:o="urn:schemas-microsoft-com:office:office"
          xmlns:x="urn:schemas-microsoft-com:office:excel"
          xmlns="urn:schemas-microsoft-com:office:spreadsheet">
  <Worksheet ss:Name="Worksheet1">
    <Table>
      <Column ss:Width="100"></Column>

      <Row>
        <Cell ss:Index="1" ss:StyleID="headerStyle">
          <Data ss:Type="String">Submitted By</Data>
        </Cell>
      </Row>
      <Row>
        <Cell ss:Index="1" ss:StyleID="alternatingItemStyle">
          <Data ss:Type="String">Value1-0</Data>
        </Cell>
      </Row>
    </Table>
    <AutoFilter xmlns="urn:schemas-microsoft-com:office:excel"
                x:Range="R1C1:R1C5"></AutoFilter>
  </Worksheet>
</Workbook>

问题在于试图选择行与当

  <xsl:for-each select="//Row">
    <xsl:copy-of select="."/>
  </xsl:for-each>

它不匹配。 我删除了所有名称间距的,它工作正常。 所以,我怎么得到“选择”匹配行?

Answer 1:

声明的命名空间的命名空间前缀在XSLT,然后select使用前缀:

<xsl:stylesheet ... xmlns:os="urn:schemas-microsoft-com:office:spreadsheet">
  ...   
  <xsl:for-each select="//os:Row">
    ...
  </xsl:for-each>
  ...
</xsl:stylesheet>

这通常会导致在易于阅读的XPath。 然而,XSLT / XPath的工具生成以下,等效代码:

<xsl:for-each select="//*[local-name()='Row' = and namespace-uri()='urn:schemas-microsoft-com:office:spreadsheet']">
   ...
</xsl:for-each>


Answer 2:

如果你不关心的命名空间,你可以使用XPath`本地名称()”函数:

<xsl:for-each select="//*[local-name() = 'Row']">
  <xsl:copy-of select="."/>
</xsl:for-each>

或者同样的同样的事情可以这样表示。 我不能肯定这是否是标准的XPath,如果所有的XPath实现支持它(ColdFusion的呢,所以大概Java那样为好)。 也许有人知道,如果这符合任何标准。

<xsl:for-each select="//:Row">
  <xsl:copy-of select="."/>
</xsl:for-each>


Answer 3:

Tomalek和ckarras给出很好的答案,但我要澄清其背后的原因。

你是不匹配的元素是在它们出现在文档,这是范围的默认命名空间,他们是在没有前缀宣布该作用域的命名空间(如

xmlns="urn:schemas-microsoft-com:office:spreadsheet"

在上Workbook元素)。 即使标记名没有一个名称空间前缀,他们是在一个命名空间。

然而,XPath的要求,在一个命名空间元素的所有名称的前缀合格,否则,该命名空间与明确指定namespace-uri()谓词中。 因此,您必须使用local-name()函数的谓词的元素名称相匹配(并使用namespace-uri()函数,以及如果有跨命名空间名称冲突的危险),或您必须声明每个在您希望用一个前缀匹配的XPath元素,并有资格在XPath表达式与他们的命名空间前缀的元素名称的命名空间。



文章来源: How to 'select' from XML with namespaces?
标签: xml xslt