Как извлечь значение c из XML, используя Xpath или XSLT - PullRequest
0 голосов
/ 24 февраля 2020

Мне нужно извлечь значение для каждой 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>

1 Ответ

1 голос
/ 24 февраля 2020

Ваш тест:

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

проверяет существование элемента AvamarGridTime, атрибутом Day которого является понедельник во всем XML входе . Это возвращает true для каждого из проверенных узлов. Чтобы проверить только текущий узел, измените его на:

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

Или просто:

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

Добавлено:

Для создания отдельного Элемент Day для каждого AvamarGrid в пределах выбранного AvamarGridTime вы можете сделать:

<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, вы должны добавить элемент root.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...