【问题标题】:Change text of elements identified by dynamic XPath更改由动态 XPath 标识的元素的文本
【发布时间】:2013-06-13 13:57:42
【问题描述】:

我有一个带有 2 个 XML 片段的 XML,第一个是必须应用新值的片段(它可以包含非常复杂的元素),例如

... some static parents
<a:element1>
   <a:subelement tag="someString">
      <a:s1>a</a:s1>
   </a:subelement>
</a:element1>
<a:element2>b</a:element2>
<a:element3>c</a:element3>
... lots of other elements like the above ones

第二个片段具有从第一个 XML 生成的 XPath 和一个新值,例如

<field>
   <xpath>/Parent/element1/subelement[@tag="someString"]/s1</xpath>
   <newValue>1</newValue>
</field>
<field>
   <xpath>/Parent/element2</xpath>
   <newValue>2</newValue>
</field>

我们可能没有新值可应用于第一个片段中的所有元素。

我正在努力进行 XSLT 转换,该转换应将新值应用于 XPath 指示的位置。

输出应该是:

... some static parents
<a:element1>
   <a:subelement tag="someString">
      <a:s1>1</a:s1>
   </a:subelement>
</a:element1>
<a:element2>2</a:element2>
... lots of other elements like the above ones

我可以访问 xalan:evaluate 来评估动态 xpath。我正在尝试不同的解决方案,当它们开始有意义时,我会在这里写出来。

任何方法的想法都受到好评。谢谢

【问题讨论】:

    标签: xslt xpath xalan


    【解决方案1】:

    Oki,我找到了方法,我会在这里写下答案,也许有人有时会需要这个:

    <xsl:template match="/">
    
    <!-- static parents -->
      <a:Root>
        <xsl:apply-templates select="/a:Root/a:Parent" />
      </a:Root>
    
    </xsl:template>
    
    <xsl:template match="@*|*|text()">
    
    <xsl:variable name="x" select="generate-id(../.)" />
    <xsl:variable name="y" select="//field[generate-id(xalan:evaluate(xpath)) = $x]" />
    
    <xsl:choose>
      <xsl:when test="$y">
        <xsl:value-of select="$y/newValue" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
            <xsl:apply-templates select="@*|*|text()" />
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
    
    </xsl:template>
    

    并解释转换: 我正在写下静态部分,然后在我感兴趣的片段上调用 ​​apply-templates,该片段具有液体结构。

    然后我使用稍微修改的身份转换将所有内容从源复制到目标(从 /a:Root/a:Parent 片段开始),除非我们将自己定位在文本上我有兴趣改变。

    我感兴趣的 text() 会将第二个片段中的 xpath 字符串引用的元素作为父 (../.) 元素。变量 xwhen 的上下文中表示此元素。

    变量 y 找到一个 field 元素,该元素有一个 xpath 元素作为子元素,如果使用 xalan 进行评估,该元素将引用与 x 变量相关的相同元素。 现在我使用 generate-id() 来比较物理元素,否则它会通过元素的 toString 进行比较(这是错误的)。如果变量 y 不存在,则意味着我没有该元素的 xpath 元素可以更改,我将不理会它。如果存在 y 变量,我可以从中获取 newValue 并且我当前位于要更新文本的元素上。

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多