如何在 Nokogiri 中将所有 XML 标签设为小写?

How can I make all XML tags lowercase in Nokogiri?

我正在解析从各种提要中获得的一些 XML。显然,某些 XML 偶尔会有一个全大写的标签。我想将 XML 规范化为所有小写标签,以便于搜索等。

我想做的是:

parsed = Nokogiri::XML.parse(xml_content)
node = parsed.css("title")  # => should return a Nokogiri node for the title tag

但是,某些 XML 文档中有 "TITLE" 个标签。

无论它的标签是 "title"、"TITLE" 还是 "Title",我有什么选择来获取该节点?

谢谢!

如果您想通过小写所有标签名称来转换 xml 文档,可以采用以下一种方法:

parsed = Nokogiri::XML.parse(xml_content)
parsed.traverse do |node|
  node.name = node.name.downcase if node.kind_of?(Nokogiri::XML::Element)
end

作为一般方法,您可以将所有元素(标记)名称转换为小写(例如,通过使用 XSLT 或其他解决方案),然后仅使用小写执行所有 XPath/CSS 查询。

This XSLT solution should work;然而,我的 Ruby (2.0.0p481) and/or Nokogiri (1.5.6) 版本神秘地抱怨(也许是关于使用“lower-case(...)”函数?也许 Nokogiri 不支持XSLT v2?)

这是一个似乎有效的解决方案:

require 'nokogiri'

xslt = Nokogiri::XSLT(File.read('lower.xslt'))
# <?xml version="1.0" encoding="UTF-8"?>
# <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
#   <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
#   <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
#   <xsl:template match="*">
#     <xsl:element name="{translate(local-name(), $uppercase, $lowercase)}">
#       <xsl:apply-templates />
#     </xsl:element>
#   </xsl:template>
# </xsl:transform>

doc  = Nokogiri::XML(File.read('doc.xml'))
# <?xml version="1.0" encoding="UTF-8"?>
# <FOO>
#  <BAR>Bar</BAR>
#  <GAH>Gah</GAH>
#  <ZIP><DOO><DAH/></DOO></ZIP>
# </FOO>

puts xslt.transform(doc)
# <?xml version="1.0"?>
# <foo>
#   <bar>Bar</bar>
#   <gah>Gah</gah>
#   <zip><doo><dah/></doo></zip>
# </foo>