如何获得以前和当前节点内的文本价值之间的差额(How to get the difference b

2019-11-04 11:36发布

你能帮我在这。 我想插入一个节点,每个节点。 此节点包含该节点的“OriIndex”和前一节点“OriIndex”(只有一个在此之前)之间的差异。 写我的XSLT时,我有一个编译错误。

我输入的是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
  <Test>
    <TestPhase>1</TestPhase>
    <TestFlow>1</TestFlow>
    <TestParameter>1</TestParameter>
    <OriIndex>0</OriIndex>
  </Test>
  <Test>
    <TestPhase>1</TestPhase>
    <TestFlow>1</TestFlow>
    <TestParameter>2</TestParameter>
    <OriIndex>1</OriIndex>
  </Test>
  <Test>
    <TestPhase>1</TestPhase>
    <TestFlow>3</TestFlow>
    <TestParameter>1</TestParameter>
    <OriIndex>2</OriIndex>
  </Test>
  <Test>
    <TestPhase>1</TestPhase>
    <TestFlow>2</TestFlow>
    <TestParameter>2</TestParameter>
    <OriIndex>3</OriIndex>
  </Test>

我的XML输出(这个是错误的,因为第二个项目的差异应该是1 =当前OriIndex(1) - 以前OriIndex(0)其实我不知道如何做到这一点。):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root>
  <Test>
    <TestPhase>1</TestPhase>
    <TestFlow>1</TestFlow>
    <TestParameter>1</TestParameter>
    <OriIndex>0</OriIndex>
    <SortedIndex>0</SortedIndex>
    <Diff>1</Diff>
  </Test>
  <Test>
    <TestPhase>1</TestPhase>
    <TestFlow>1</TestFlow>
    <TestParameter>2</TestParameter>
    <OriIndex>1</OriIndex>
    <SortedIndex>1</SortedIndex>
    <Diff>0</Diff>
  </Test>
.
.
.
.

我的XSLT是:

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

<xsl:output method="xml" encoding = "UTF-8" indent="yes" omit-xml-declaration="no" standalone="yes" />


  <xsl:template match="Root">
   <xsl:copy>
    <xsl:apply-templates select="Test">
      <xsl:sort select="TestPhase" data-type="number" order="ascending"/>
      <xsl:sort select="TestFlow" data-type="number" order="ascending"/>
      <xsl:sort select="TestParameter" data-type="number" order="ascending"/>
    </xsl:apply-templates>
   </xsl:copy>
  </xsl:template>


  <xsl:template match="@* | node()">
    <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>


   <xsl:template match="Test">
     <xsl:copy>
       <xsl:apply-templates select="@* | *"/> 
       <SortedIndex><xsl:value-of select="position() - 1"/></SortedIndex>
       <Diff><xsl:value-of select="OriIndex - OriIndex[position() - 1]" /></Diff>
     </xsl:copy>
   </xsl:template>


</xsl:stylesheet>

请帮忙。

非常感谢你。 你的努力是非常赞赏。

干杯!

Answer 1:

此节点[应当]含有此节点的“OriIndex”和前一节点的“OriIndex”(只有一个在此之前)之间的差。

XPath表达式为<OriIndex>上下文节点的先前同级子(相当于前述同级元素 ,因为只有元件和文档根可具有的子元素)。将

preceding-sibling::*[1]/OriIndex

对于您的具体数据和情况下,你可能会写,而不是这个更明确的表达:

preceding-sibling::Test[1]/OriIndex

总体而言,那么,你不妨把一起到这个模板:

    <xsl:template match="Test">
      <xsl:copy>
        <xsl:apply-templates select="@* | *"/> 
        <SortedIndex><xsl:value-of select="position() - 1"/></SortedIndex>
        <Diff><xsl:value-of
            select="OriIndex - preceding-sibling::Test[1]/OriIndex" /></Diff>
      </xsl:copy>
    </xsl:template>


文章来源: How to get the difference between previous and current node inner text value
标签: xml xslt