Цикл XSLT, возвращающий то же значение - PullRequest
0 голосов
/ 28 декабря 2018

Впервые в XSLT, и я хочу выровнять свой XML-файл для (более позднего) приема в SQL.В настоящее время у меня возникают проблемы с циклическим просмотром XML-документа.В данный момент он собирает количество тегов, но возвращает то же значение.Также, когда внутри циклов есть циклы, кажется, что проблема заключается в том, чтобы вообще не получать значения.

XML:

<?xml version="1.0"?>
<Example>
  <Num>12</Num>
  <Num>13</Num>
  <Num>14</Num>
  <Num>15</Num>
  <Num>16</Num>
  <New>N</New>
  <Age>118</Age>
  <Name>
    <PrimNam>
      <Surnm>SAM</Surnm>
      <FstNm>SAM</FstNm>
      <SecNm>SAM</SecNm>
    </PrimNam>
    <Alias>
      <Id>12</Id>
      <DOB>01/01/1900</DOB>
      <AliasNam>
        <Surnm>SAM</Surnm>
        <FstNm>SAMUEL</FstNm>
      </AliasNam>
      <AliasDate>28/12/2018</AliasDate>
    </Alias>
  </Name>
</Example>

Вот как выглядит мой XSLT в данный момент

<xsl:for-each select="Example/Num">
    <Num><xsl:value-of select="../Num"/></Num>
</xsl:for-each>

    <New><xsl:value-of select="Example/New"/></New>
    <Age><xsl:value-of select="Example/Age"/></Age>

    <xsl:for-each select="Example/Name/PrimNam">
        <Surnm><xsl:value-of select="../../Surnm"/></Surnm>
        <FstNm><xsl:value-of select="../../FstNm"/></FstNm>
        <SecNm><xsl:value-of select="../../SecNm"/></SecNm>
    </xsl:for-each>
    <xsl:for-each select="Example/Name/Alias">
        <Id><xsl:value-of select="../../Id"/></Id>
        <DOB><xsl:value-of select="../../DOB"/></DOB>
            <xsl:for-each select="Example/Name/Alias/AliasNam">
                <Surnm><xsl:value-of select="../../../Surnm"/></Surnm>
                <FstNm><xsl:value-of select="../../../FstNm"/></FstNm>
            </xsl:for-each>
        <AliasDate><xsl:value-of select="../../AliasDate"/></AliasDate>
    </xsl:for-each>

И полученный результат выглядит следующим образом

<Num>12</Num>
<Num>12</Num>
<Num>12</Num>
<Num>12</Num>
<Num>12</Num>
<New>N</NewCon>
<Age>118</Age>
<Surnm></Surnm>
<FstNm></FstNm>
<SecNm></SecNm>
<Id></Id>
<DOB></DOB>
<AliasDate></AliasDate>

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018
  1. Инструкция:

    <xsl:for-each select="Example/Num">
    

    ставит вас в контекст Num.Чтобы получить значение текущего Num, вам необходимо выполнить:

    <xsl:value-of select="."/>
    

    Что вы делаете:

    <xsl:value-of select="../Num"/>
    

    выбирает сначала Num дочерний элемент родительского текущего узла - который является одинаковым для каждого Num.


Инструкция:

<xsl:for-each select="Example/Name/PrimNam">

ставит вас в контекст PrimNam.Чтобы получить значение Surnm отсюда, вы должны сделать:

<xsl:value-of select="Surnm"/>

not:

<xsl:value-of select="../../Surnm"/>

, поскольку Surnm является child ofPrimNam.То же самое относится и к другим узлам, которые вы не можете выбрать.


Обратите внимание, что вы можете значительно сократить свою таблицу стилей, используя xsl:copy - например:

<xsl:copy-of select="Example/New"/>

вместо:

<New><xsl:value-of select="Example/New"/></New>
0 голосов
/ 28 декабря 2018

Похоже, вы хотите сгладить XML.
Одна из возможностей - следующий шаблон XSLT-1.0:

<xsl:template match="Example/Num | Example/New | Example/Age | Example/Name/PrimNam/* | Example/Name/Alias/Id | Example/Name/Alias/DOB | Example/Name/Alias/AliasNam/* | Example/Name/Alias/AliasDate">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

Вывод:

<Num>12</Num>
<Num>13</Num>
<Num>14</Num>
<Num>15</Num>
<Num>16</Num>
<New>N</New>
<Age>118</Age>
<Surnm>SAM1</Surnm>
<FstNm>SAM2</FstNm>
<SecNm>SAM3</SecNm>
<Id>12</Id>
<DOB>01/01/1900</DOB>
<Surnm>SAM</Surnm>
<FstNm>SAMUEL</FstNm>
<AliasDate>28/12/2018</AliasDate>

Этоупрощенная версия вашего входного XML.

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