草庐IT

xml - 在 XPath 中提取以下兄弟节点的子节点属性

coder 2024-07-04 原文

我的 XML 代码是,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<unit
   xmlns="http://www.srcML.org/srcML/src" revision="0.9.5" language="Java" filename="ListSample.java">
<class>
    <specifier>public</specifier> class 
    <name>ListSample</name>
    <block>{

        <decl_stmt>
            <decl>
                <specifier>private</specifier>
                <type>
                    <name>List</name>
                </type>
                <name>nameList</name>
                <init>=
                    <expr>
                        <operator>new</operator>
                        <call>
                            <name>List</name>
                            <argument_list>()</argument_list>
                        </call>
                    </expr>
                </init>
            </decl>;
        </decl_stmt>
        <function>
            <specifier>public</specifier>
            <type>
                <name>void</name>
            </type>
            <name>method</name>
            <parameter_list>()</parameter_list>
            <block>{

                <expr_stmt>
                    <expr>
                        <call>
                            <name>
                                <name>nameList</name>
                                <operator>.</operator>
                                <name>add</name>
                            </name>
                            <argument_list>(
                                <argument>
                                    <expr>
                                        <literal type="string">"name"</literal>
                                    </expr>
                                </argument>)
                            </argument_list>
                        </call>
                    </expr>;
                </expr_stmt>
                }
            </block>
        </function>
        }
    </block>
</class>

我正在尝试提取任何列表的数据类型。例如,nameList 是 XML 文件中给出的列表。我试图通过搜索列表的名称(前面是 List 关键字)然后根据 literal type="string" 确定数据类型来实现这一点。这是我使用 XPath 和 XSLT 的代码。

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

<xsl:template
    match="//*[local-name()='name'][preceding-sibling::node()='List']">
    <xsl:variable name="listName" select="text()"></xsl:variable>
    <xsl:call-template name="getType">
        <xsl:with-param name="listName" select="$listName" />
    </xsl:call-template>

</xsl:template>
<xsl:template name="getType"
    match="//*[local-name()='name'][following-sibling::node()='.' and following-sibling::node()[2]='add']">
    <xsl:param name="listName" />
    <xsl:if test="node()=$listName">
        <xsl:message>
            <xsl:value-of select="parent::node()/following-sibling::literal/@type" />
        </xsl:message>
    </xsl:if>

</xsl:template>

但是,邮件中包含的部分

<xsl:message>
    <xsl:value-of select="parent::node()/following-sibling::literal/@type" />
</xsl:message>

无法获取文字类型。如何更正代码以便获取属性中的文字节点和数据类型?提前致谢。

最佳答案

我仍然不确定这样做的目的是什么,但这会产生预期的结果:

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

  <!-- key to locate the usage of a list in an .add() operation based on the list 
       variable's name -->      
  <xsl:key name="kListUsage"
           match="src:call[src:name[src:operator[1] = '.' and src:name[2] = 'add']]"
           use="src:name/src:name[1]" />

  <!-- Override default handling of text nodes -->
  <xsl:template match="text()" />

  <xsl:template match="src:decl[src:type/src:name = 'List']/src:name">
    <xsl:apply-templates select="key('kListUsage', .)[1]" mode="listUsage" />
  </xsl:template>

  <xsl:template match="src:call" mode="listUsage">
    <xsl:message>
      <xsl:value-of select="src:argument_list/src:argument[1]/src:expr/src:literal/@type"/>
    </xsl:message>
  </xsl:template>
</xsl:stylesheet>

在您的样本输入上运行时,会输出以下消息:

string

除其他事项外,如果您考虑节点相对于它们的共享祖先的位置并从这些共享祖先开始工作,逻辑会更清晰,那么您似乎过多地关注了节点之间的相对位置。

关于xml - 在 XPath 中提取以下兄弟节点的子节点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250014/

有关xml - 在 XPath 中提取以下兄弟节点的子节点属性的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  6. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  9. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

  10. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

随机推荐