使用XPath根据属性引用匹配节点

时间:2020-10-14 17:36:20

标签: xml xpath

给出了以下XML代码段:

<TypeB id="FD2020Q1YTD">
  <identifier>num1</identifier>
</TypeB>

<TypeA ref="FD2020Q1YTD">num1</TypeA>
<TypeA ref="FD2020Q1YTD_dei_LegalEntityAxis_pnw_ArizonaPublicServiceCompanyMember">num2</TypeA>

如何使用XPath查询以下内容: 我要选择所有“ TypeA”元素,其中元素的ref属性指向这样一个节点,其中增强器的内部文本与TypeA的内部文本匹配。

“ TypeA”中的“ num1”应与“ TypeB /标识符”中的“ num1”相匹配

更新

wp78de的建议似乎是最好的:

//TypeA[.=//TypeB/identifier and @ref=//TypeB/@id]

但是在这种情况下,如何确定第一个条件:.=//TypeB/identifier引用相同的TypeB实例,作为第二个条件:@ref=//TypeB/@id

3 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解你,但是我相信你正在寻找类似的东西:

#include <iostream>
#include <thread>

#include <SDL2/SDL.h>
#undef main

#include <glad/glad.h>

void RenderThread(bool& running, SDL_Window* window) {
    SDL_GLContext context = SDL_GL_CreateContext(window);
    SDL_GL_MakeCurrent(window, context);
    gladLoadGL();

    int r = 0;
    while (running) {
        uint64_t startTime = SDL_GetPerformanceCounter();

        glClearColor(r / 255.0f, 0, 0, 1);
        r = (r + 1) % 256;
        glClear(GL_COLOR_BUFFER_BIT);
        SDL_GL_SwapWindow(window);

        double deltaTime = (SDL_GetPerformanceCounter() - startTime) / (double)SDL_GetPerformanceFrequency();
        std::cout << 1.0 / deltaTime << " fps" << std::endl;
    }

    SDL_GL_DeleteContext(context);
}

int main() {
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* w1 = SDL_CreateWindow("w1", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_OPENGL);
    SDL_Window* w2 = SDL_CreateWindow("w2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 700, 700, SDL_WINDOW_OPENGL);

    bool running = true, r1 = true, r2 = true;
    std::thread t1(RenderThread, std::ref(r1), w1);
    std::thread t2(RenderThread, std::ref(r2), w2);

    while (running) {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                running = false;
                r1 = false;
                t1.join();
            } else if (event.type == SDL_WINDOWEVENT) {
                if (event.window.event == SDL_WINDOWEVENT_CLOSE) {
                    r2 = false;
                    t2.join();
                    SDL_DestroyWindow(w2);
                }
            }
        }
    }

    SDL_DestroyWindow(w1);

    SDL_Quit();
    return 0;
}

输出应为:

//TypeA[text()=//TypeB/identifier/text()]

答案 1 :(得分:1)

使用XPath 2.0的解决方案:

for $a in //TypeA, $b in //TypeB
    return if ($b/@id=$a/@ref and $a/text()=$b/identifier/text()) then $a else ()

不要认为XPath 1.0可以解决。

答案 2 :(得分:1)

尝试这样:

//TypeA[.=//TypeB/identifier and @ref=//TypeB/@id]

Demo

相关问题