首页 > 解决方案 > 如何使用 Xpath 或 XSLT 从 XML 中提取特定值

问题描述

我需要根据 Day 为每个 AvamarGrid 提取值。

  <AvamarGridTime Day="Monday">
    <AvamarGrid>frk-opavautl921</AvamarGrid>
  </AvamarGridTime>
  <AvamarGridTime Day="Tuesday">
    <AvamarGrid>ftc-opavautl961</AvamarGrid>
    <AvamarGrid>ftc-opavbutl921</AvamarGrid>
    <AvamarGrid>ptc-opavautl981</AvamarGrid>
  </AvamarGridTime>
  <AvamarGridTime Day="Wednesday">
    <AvamarGrid>lhr-opavautl941</AvamarGrid>
  </AvamarGridTime>
a
  <AvamarGridTime Day="Thursday">
    <AvamarGrid>sf1-its-bku-t01</AvamarGrid>
    <AvamarGrid>sf1-opavautl901</AvamarGrid>
  </AvamarGridTime>
  <AvamarGridTime Day="Friday">
    <AvamarGrid>par-opavautl921</AvamarGrid>
  </AvamarGridTime>
</AvamarGrids>

我在 XSLT 下面使用

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output indent="no" />
  <xsl:template match="/">
    <Day>
      <xsl:for-each select="//AvamarGridTime">
        <xsl:if test="//AvamarGridTime[@Day=&quot;Monday&quot;]">
          <xsl:value-of select="AvamarGrid" disable-output-escaping="no" />
        </xsl:if>
      </xsl:for-each>
    </Day>
  </xsl:template>
</xsl:stylesheet>

但是,低于输出,而不仅仅是:frk-opavautl921

<?xml version="1.0" encoding="UTF-8"?><Day>frk-opavautl921ftc-opavautl961lhr-opavautl941sf1-its-bku-t01par-opavautl921</Day>

标签: xmlxsltxpath

解决方案


你的测试:

<xsl:if test="//AvamarGridTime[@Day=&quot;Monday&quot;]">

检查整个 XML 输入中是否存在属性为 Monday的AvamarGridTime元素。这对每个检查的节点都返回 true。要仅测试当前节点,请将其更改为:Day

<xsl:if test="@Day=&quot;Monday&quot;">

或者简单地做:

<xsl:template match="/AvamarGrids">
    <Day>
        <xsl:value-of select="AvamarGridTime[@Day='Monday']/AvamarGrid" />
    </Day>
</xsl:template>

添加:

为了在 selected中Day为每个元素创建一个单独的元素,您可以执行以下操作:AvamarGridAvamarGridTime

<xsl:template match="/AvamarGrids">
    <xsl:for-each select="AvamarGridTime[@Day='Tuesday']/AvamarGrid">
        <Day>
            <xsl:value-of select="." />
        </Day>
    </xsl:for-each>
</xsl:template>

但是,请注意结果是一个 XML 片段。如果要生成格式良好的 XML 文档,则必须添加根元素。


推荐阅读