Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT节点值比较_Xslt - Fatal编程技术网

XSLT节点值比较

XSLT节点值比较,xslt,Xslt,如何将ip地址与家族和姓名进行比较。使用XSLT文件。详细地说,我有一个xml文件,其中包含operatorstation节点列表,每个operatorstation都有其唯一的信息。因此,通过将第一个operatorstation节点视为主节点,比较所有剩余的从属operatorstation信息。首先需要通过分组Family&Name来比较IPAddress,结果如下所示。因此,我正在寻找starnsform脚本XSLT,它给我的结果如下所示。 请检查我用作输入的xml文件、我期望输出结果的

如何将ip地址与家族和姓名进行比较。使用XSLT文件。详细地说,我有一个xml文件,其中包含operatorstation节点列表,每个operatorstation都有其唯一的信息。因此,通过将第一个operatorstation节点视为主节点,比较所有剩余的从属operatorstation信息。首先需要通过分组Family&Name来比较IPAddress,结果如下所示。因此,我正在寻找starnsform脚本XSLT,它给我的结果如下所示。 请检查我用作输入的xml文件、我期望输出结果的xml文件以及我正在处理的XSLT文件。
如果还有人不明白,请提问…… 输入xml文件

<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection xmlns="http://ACORD.org/Standards/Life/2">
  <OperatorStation><Name>OS01</Name>
    <Nodes>
      <DataNodeBase >
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
      </DataNodeBase>
    </Nodes>
  </OperatorStation>
  <OperatorStation><Name>OS02</Name>
    <Nodes>
          <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
          </DataNodeBase>
    </Nodes>
  </OperatorStation>
  <OperatorStation><Name>OS03</Name>
    <Nodes>
          <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
          </DataNodeBase>
    </Nodes>
  </OperatorStation>
  <OperatorStation><Name>OS04</Name>
    <Nodes>
        <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
        </DataNodeBase>
    </Nodes>
  </OperatorStation>
</OperatorStationCollection>
我想我终于明白了这个问题

下面的样式表将按
系列
名称
元素(位于
节点/DataNodeBase
中)对
操作符站
元素进行分组。请注意,还有另一个
名称
元素是
OperatorStation
的直接子元素-这可能会造成混淆

对于每个组,将列出第一个
IPAddress
元素,并将其他元素与之进行比较。这些结果元素的名称取自(顶部)
Name
元素的值(只是为了增加一些混淆…)

请特别注意对源XML文档中声明的名称空间的处理

样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://ACORD.org/Standards/Life/2"
exclude-result-prefixes="ns"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="kOperatorStation" match="ns:OperatorStation" use="concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name)"/>

<xsl:template match="/">
<OperatorStationCollection>
    <xsl:for-each select="ns:OperatorStationCollection/ns:OperatorStation[generate-id() = generate-id(key('kOperatorStation',concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))[1])]" >
    <Result>
        <Family><xsl:value-of select=".//ns:Family"/></Family>
        <AdaptorName><xsl:value-of select=".//ns:DataNodeBase/ns:Name"/></AdaptorName>

        <xsl:variable name="ip" select=".//ns:IPAddress" />

        <xsl:for-each select="key('kOperatorStation', concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))" >  
                <xsl:element name="{ns:Name}">
                    <xsl:choose>
                        <xsl:when test="position()=1">
                            <xsl:value-of select="$ip"/>
                        </xsl:when>
                        <xsl:when test=".//ns:IPAddress=$ip">
                            <xsl:text>Equal</xsl:text>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>UnEqual</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:element>
        </xsl:for-each>
    </Result> 
    </xsl:for-each>
</OperatorStationCollection>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection xmlns="http://ACORD.org/Standards/Life/2">
    <OperatorStation>
        <Name>OS01</Name>
        <Nodes>
            <DataNodeBase >
                    <Family>NetworkSettings</Family>
                    <Name>Internet</Name>
                    <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>  
    <OperatorStation>
        <Name>OS02</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
        </OperatorStation>      
        <OperatorStation>
        <Name>OS03</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>      
    <OperatorStation>
        <Name>OS04</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>
</OperatorStationCollection>
<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection>
  <Result>
    <Family>NetworkSettings</Family>
    <AdaptorName>Internet</AdaptorName>
    <OS01>111.22.22.3</OS01>
    <OS02>Equal</OS02>
    <OS03>UnEqual</OS03>
    <OS04>UnEqual</OS04>
  </Result>
</OperatorStationCollection>

相等的
不等
源XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://ACORD.org/Standards/Life/2"
exclude-result-prefixes="ns"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="kOperatorStation" match="ns:OperatorStation" use="concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name)"/>

<xsl:template match="/">
<OperatorStationCollection>
    <xsl:for-each select="ns:OperatorStationCollection/ns:OperatorStation[generate-id() = generate-id(key('kOperatorStation',concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))[1])]" >
    <Result>
        <Family><xsl:value-of select=".//ns:Family"/></Family>
        <AdaptorName><xsl:value-of select=".//ns:DataNodeBase/ns:Name"/></AdaptorName>

        <xsl:variable name="ip" select=".//ns:IPAddress" />

        <xsl:for-each select="key('kOperatorStation', concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))" >  
                <xsl:element name="{ns:Name}">
                    <xsl:choose>
                        <xsl:when test="position()=1">
                            <xsl:value-of select="$ip"/>
                        </xsl:when>
                        <xsl:when test=".//ns:IPAddress=$ip">
                            <xsl:text>Equal</xsl:text>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>UnEqual</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:element>
        </xsl:for-each>
    </Result> 
    </xsl:for-each>
</OperatorStationCollection>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection xmlns="http://ACORD.org/Standards/Life/2">
    <OperatorStation>
        <Name>OS01</Name>
        <Nodes>
            <DataNodeBase >
                    <Family>NetworkSettings</Family>
                    <Name>Internet</Name>
                    <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>  
    <OperatorStation>
        <Name>OS02</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
        </OperatorStation>      
        <OperatorStation>
        <Name>OS03</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>      
    <OperatorStation>
        <Name>OS04</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>
</OperatorStationCollection>
<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection>
  <Result>
    <Family>NetworkSettings</Family>
    <AdaptorName>Internet</AdaptorName>
    <OS01>111.22.22.3</OS01>
    <OS02>Equal</OS02>
    <OS03>UnEqual</OS03>
    <OS04>UnEqual</OS04>
  </Result>
</OperatorStationCollection>

OS01
网络设置
互联网
111.22.22.3  
OS02
网络设置
互联网
111.22.22.3  
OS03
网络设置
互联网
111.22.22.4  
OS04
网络设置
互联网
111.22.22.4  
结果:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://ACORD.org/Standards/Life/2"
exclude-result-prefixes="ns"> 
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:key name="kOperatorStation" match="ns:OperatorStation" use="concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name)"/>

<xsl:template match="/">
<OperatorStationCollection>
    <xsl:for-each select="ns:OperatorStationCollection/ns:OperatorStation[generate-id() = generate-id(key('kOperatorStation',concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))[1])]" >
    <Result>
        <Family><xsl:value-of select=".//ns:Family"/></Family>
        <AdaptorName><xsl:value-of select=".//ns:DataNodeBase/ns:Name"/></AdaptorName>

        <xsl:variable name="ip" select=".//ns:IPAddress" />

        <xsl:for-each select="key('kOperatorStation', concat(.//ns:Family, '#', .//ns:DataNodeBase/ns:Name))" >  
                <xsl:element name="{ns:Name}">
                    <xsl:choose>
                        <xsl:when test="position()=1">
                            <xsl:value-of select="$ip"/>
                        </xsl:when>
                        <xsl:when test=".//ns:IPAddress=$ip">
                            <xsl:text>Equal</xsl:text>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:text>UnEqual</xsl:text>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:element>
        </xsl:for-each>
    </Result> 
    </xsl:for-each>
</OperatorStationCollection>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection xmlns="http://ACORD.org/Standards/Life/2">
    <OperatorStation>
        <Name>OS01</Name>
        <Nodes>
            <DataNodeBase >
                    <Family>NetworkSettings</Family>
                    <Name>Internet</Name>
                    <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>  
    <OperatorStation>
        <Name>OS02</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.3</IPAddress>  
            </DataNodeBase>
        </Nodes>
        </OperatorStation>      
        <OperatorStation>
        <Name>OS03</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>      
    <OperatorStation>
        <Name>OS04</Name>
        <Nodes>
            <DataNodeBase>
                <Family>NetworkSettings</Family>
                <Name>Internet</Name>
                <IPAddress>111.22.22.4</IPAddress>  
            </DataNodeBase>
        </Nodes>
    </OperatorStation>
</OperatorStationCollection>
<?xml version="1.0" encoding="utf-8"?>
<OperatorStationCollection>
  <Result>
    <Family>NetworkSettings</Family>
    <AdaptorName>Internet</AdaptorName>
    <OS01>111.22.22.3</OS01>
    <OS02>Equal</OS02>
    <OS03>UnEqual</OS03>
    <OS04>UnEqual</OS04>
  </Result>
</OperatorStationCollection>

网络设置
互联网
111.22.22.3
相等的
不等
不等

是否可以显示希望输出的XML以及当前尝试的XSLT?谢谢您是否可以编辑问题并将其包含在XML中,而不是将其添加为注释。另外,不要忘记包含您尝试过的任何XSLT。如果您仍然被卡住,请先看一看,因为这很好地解释了“慕尼黑分组”。谢谢嗨,蒂姆,我正在尝试添加脚本。我正在处理它,但遇到格式异常,无法添加脚本,也无法在其中添加图像。谢谢!你能建议我另一种方法吗……我正在寻找这个结果……我将以表格格式用HTML显示。。。。。。NetworkSettings Internet 111.22.22.3 Equal Hi Tim,我在等你的答复……这个问题目前已结束,因为我不清楚要问什么。但它可以重新打开。您应该对其进行编辑,以包括您当前尝试过的任何XSLT(即使它不起作用!)。此外,如果您解释所需的逻辑,也会有所帮助。您说希望得到“HTML表格格式”的结果,但显示的输出是XML。如果需要XML,您能解释一下os01、os02标记的来源吗。谢谢嗨,迈克尔,是的,你理解我的问题,但它给出了结果。。。。。。。不是你建议的/显示的。你检查了结果了吗?@AshishPayghan我的答案中的结果是通过使用指定的确切源和样式表执行实际转换获得的。我建议您检查自己的实现,因为utf-16编码不太可能自发发生。嗨,Michael,我正在尝试通过C代码和xml nodepad获得结果,但给出了相同的结果。您能帮我获得预期的结果吗?我哪里做错了。。。Exe链接:在xml记事本中,您可以添加xml文件和转换脚本以获得结果。我添加了有问题的c#代码。等待你的答复。。。。Thanks@AshishPayghan我没有使用记事本(或Windows),因此我恐怕无法在这方面帮助您。与C#编码相同。如果您愿意,您可以在这里单独测试XSL转换:在您的位置上,我将使用最小的XML输入(比如说
)和类似的最小样式表(比如标识转换)来测试您得到的编码。这将告诉您问题是与输入有关还是与流程有关。