当前位置: 首页 > 知识库问答 >
问题:

为什么更改节点上下文不起作用?

庞阳波
2023-03-14

我的源XML文档

<?xml version="1.0" encoding="UTF-8"?>
<sample>
  <definition>
    <variable>
      <name>object01_ID_138368350261919620</name>
      <value>NUL</value>
    </variable>  
    <variable>
      <name>param01_ID_138368350261919621</name>
      <value>10</value>
    </variable>
    <variable>
      <name>param02_ID_138368350261919622</name>
      <value>100</value>
    </variable>
  </definition>
  <override>
    <assignment>
      <name>object01_ID_138368350261919620</name>
      <path>module01/object01</path>
    </assignment>
    <assignment>
      <name>param01_ID_138368350261919621</name>
      <path>module01/object01/param01</path>
    </assignment>
    <assignment>
      <name>param02_ID_138368350261919622</name>
      <path>module01/object01/param02</path>
    </assignment>
  </override>
</sample>  

根据 元素内容的模式,在 元素中的 元素中,我希望添加一个新的 元素 元素是前导信息。因此,首先,我必须创建一个新的 元素及其 内容。之后,我必须创建一个相应的 元素,该元素具有相同的 内容和特定的 内容。

这是我的目标XML文档的示例(添加param03):

<?xml version="1.0" encoding="UTF-8"?>
<sample>
  <definition>
    <variable>
      <name>param00_ID_138368350261919620</name>
      <value>NUL</value>
    </variable>
    <variable>
      <name>param01_ID_138368350261919621</name>
      <value>10</value>
    </variable>
    <variable>
      <name>param02_ID_138368350261919622</name>
      <value>100</value>
    </variable>
    <variable>
      <name>Param03_ID_138368350261919623</name>
      <value>1000</value>
    </variable>
  </definition>
  <override>
    <assignment>
      <name>param00_ID_138368350261919620</name>
      <path>module01/object01</path>
    </assignment>
    <assignment>
      <name>param01_ID_138368350261919621</name>
      <path>module01/object01/param01</path>
    </assignment>
    <assignment>
      <name>param02_ID_138368350261919622</name>
      <path>module01/object01/param02</path>
    </assignment>
    <assignment>
      <name>Param03_ID_138368350261919623</name>
      <xpath>module01/object01/param03</xpath>
    </assignment>
  </override>
</sample>

我的XSLT文档

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:fn="http://www.w3.org/2005/xpath-functions" 
  exclude-result-prefixes="fo xs fn">
  <!--
  global declarations ==========================================================
  -->
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>
  <!-- randomid here is just a fake for sake of simplification -->
  <xsl:variable name="randomid" select="138368350261919623"/>
  <!--
  template for identity ==========================================================
  -->
  <xsl:template match="node()|@*" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[1]"/>
    </xsl:copy>
    <xsl:apply-templates select="following-sibling::node()[1]"/>
  </xsl:template>
  <!--
  template for variable assignment ===============================================
  -->
  <xsl:template name="variable_assignment">
    <xsl:param name="value_node_name"/>
    <xsl:param name="value_node_path"/>
    <xsl:message select="'processing: variable assignment'"/>
    <xsl:message select="concat('applying name: ', $value_node_name)"/>
    <xsl:message select="concat('applying path: ', $value_node_path)"/>
    <xsl:call-template name="identity"/>
    <assignment>
      <name>
        <xsl:value-of select="$value_node_name"/>
      </name>
      <xpath>
        <xsl:value-of select="$value_node_path"/>
      </xpath>
    </assignment>
  </xsl:template>
  <!--
    template for processing param03 =============================================
  -->
  <xsl:template match="/sample/override[not(assignment
              /path[matches(text(), '.*/object01/param03$')])]
              /assignment[path[matches(text(), '.*/object01$')]]">
    <!-- setting params -->
    <xsl:param name="value_node_name_target">
      <xsl:value-of select="concat('Param03_ID', '_', $randomid)"/>
    </xsl:param>
    <xsl:param name="value_node_path_target">
      <xsl:value-of select="concat(./path, '/param03')"/>
    </xsl:param>
    <xsl:param name="value_node_value_target" select="'1000'"/>
    <!-- processing variable assignment -->
    <xsl:call-template name="variable_assignment">
      <xsl:with-param name="value_node_name" select="$value_node_name_target"/>
      <xsl:with-param name="value_node_path" select="$value_node_path_target"/>
    </xsl:call-template>
    <!-- processing variable definition -->
    <xsl:for-each select="/sample/definition/*[position()=last()]">
        <xsl:message select="'processing: variable definition'"/>
      <xsl:message select="concat('Here we are: ', .)"/>
      <xsl:message select="concat('applying name: ', $value_node_name_target)"/>
      <xsl:message select="concat('applying value: ', $value_node_value_target)"/>
      <xsl:call-template name="identity"/>
      <variable>
        <name>
          <xsl:value-of select="$value_node_name_target"/>
        </name>
        <value>
          <xsl:value-of select="$value_node_value_target"/>
        </value>
      </variable>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

结果XML文档错误

我遇到的问题:

>

  • 使用 不会按预期更改节点上下文。新的 元素将在最后一个位置添加到 元素中,而不是按照预期添加到 元素中。

    这是我错误的XML文档,我得到的转换后,如上所述:

    <?xml version="1.0" encoding="UTF-8"?>
    <sample>
      <definition>
        <variable>
          <name>object01_ID_138368350261919620</name>
          <value>NUL</value>
        </variable>
        <variable>
          <name>param01_ID_138368350261919621</name>
          <value>10</value>
        </variable>
        <variable>
          <name>param02_ID_138368350261919622</name>
          <value>100</value>
        </variable>
      </definition>
      <override>
        <assignment>
          <name>object01_ID_138368350261919620</name>
          <path>module01/object01</path>
        </assignment>
        <assignment>
          <name>param01_ID_138368350261919621</name>
          <path>module01/object01/param01</path>
        </assignment>
        <assignment>
          <name>param02_ID_138368350261919622</name>
          <path>module01/object01/param02</path>
        </assignment>
        <assignment>
          <name>Param03_ID_138368350261919623</name>
          <xpath>module01/object01/param03</xpath>
        </assignment>
        <variable>
          <name>param02_ID_138368350261919622</name>
          <value>100</value>
        </variable>
        <variable>
          <name>Param03_ID_138368350261919623</name>
          <value>1000</value>
        </variable>
      </override>
    </sample>
    

    我需要的帮助

    如果你们中有人能给我一些建议,我将不得不以何种方式修改XSLT文档,以改变所描述的节点上下文,我将非常感激。(上面列出的所有代码都是用Saxon HE 9.5创建和测试的)。

    <xsl:stylesheet 
        version="2.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        xmlns:fn="http://www.w3.org/2005/xpath-functions" 
        xmlns:math="java:java.lang.Math" 
        exclude-result-prefixes="xs fn math">
    
        <xsl:variable name="baseid" 
                      select='format-number((((math:random() * 
                          10000000000000) mod 10000000000000) + 
                          10000000000000), "#")'/>
    
    </xsl:stylesheet>
    

    此解决方案需要Saxon PE,因为应用了xmlns:math=“java:java.lang.math”。它工作的健壮和快速,但我不完全统计它。源XML文档中存在的ID将增加1。因此,我想写一个解决方案,选择现有ID中具有最高值的ID,将其作为基值,并通过将每个ID递增为1来创建基于该ID的其他ID。这样的解决方案将利用源XML文档的现有ID,看起来很简单,并且还可以使用Saxon HE许可证运行。那项任务仍在我的待办事项清单上。

  • 共有1个答案

    翟昊明
    2023-03-14

    我可能遗漏了一些东西,因为在我看来,这可能要简单得多:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
    
    
    <!-- fakes for sake of simplification -->
    <xsl:variable name="randomid" select="'138368350261919623'"/>
    <xsl:variable name="next_variable_value" select="1000"/>
    
    
    <xsl:template match="/sample"> 
        <xsl:copy>
            <xsl:apply-templates select="definition"/>
            <xsl:apply-templates select="override"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="definition"> 
        <xsl:copy>
            <xsl:for-each select="variable">
                <xsl:copy-of select="."/>
            </xsl:for-each>
            <variable>
                <name>
                    <xsl:value-of select="concat('Param03_ID_', $randomid)"/>
                </name>
                <value>
                    <xsl:value-of select="$next_variable_value"/>
                </value>
            </variable>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="override"> 
        <xsl:copy>
            <xsl:for-each select="assignment">
                <xsl:copy-of select="."/>
            </xsl:for-each>
            <assignment>
                <name>
                    <xsl:value-of select="concat('Param03_ID_', $randomid)"/>
                </name>
                <xpath>module01/object01/param03</xpath>
            </assignment>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    当然,更有意思的部分是,“为了简单化而假货”将如何产生。

     类似资料:
    • 我刚刚安装了node.js,还在环境变量中设置了PATH。路径值为 短期内 android命令正常工作。

    • 问题内容: 我在地图操作中使用a 作为共享计数器。但是似乎我没有正确使用它,因为工作节点上计数器的状态没有更新。这是我的柜台类的样子: 据我了解的文档,当应用程序在多个工作程序节点中运行时,这应该可以正常工作: 累加器是仅通过关联和交换操作“累加”的变量,因此可以有效地并行支持。它们可用于实现计数器(如在MapReduce中)或总和。Spark本身支持数字类型的累加器,程序员可以添加对新类型的支持

    • 我有一个音乐播放器活动来控制歌曲的播放。我已经阅读了有关管理音频焦点的文档,并在

    • 执行下面的代码 evaluate 方法中第一个参数是上下文节点,以上执行的结果是相同的,都是 body 元素,请问一下这个上下文节点参数的作用是什么?

    • 我想了两个小时,为什么这段代码不能产生预期的结果。如果我输入3个整数,比如3、4和5,它应该给出所有27个可能的和(假设数字可以是正的、负的或零) 因此,它应该产生以下内容: -3-4-5=-12 -3-4 0 = -7 -4-4 5=3 等等

    • 问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么