XSLT 1.0 цикл через различные дочерние узлы одного и того же родителя - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть xslt, который должен пройти через три дочерних узла с разными значениями и поместить их в файл.

Пока что он выбирает только первый дочерний элемент и помещает эти значения во все три узла в результирующем файле. Я перепробовал много вещей, но безрезультатно, может кто-нибудь помочь мне?

Я искал весь этот сайт много раз, но безрезультатно.

Это часть источника, который необходимо преобразовать:

<followUpObjects>
<followUpObject length="4">
<followUpObjectNumber>1</followUpObjectNumber>
<followUpObjectTargetNumber>1</followUpObjectTargetNumber>
<followUpObjectName>Kostenplaats</followUpObjectName>
<followUpObjectValue desc="Kwaliteitsdienst">5260</followUpObjectValue>
</followUpObject>
<followUpObject length="13">
<followUpObjectNumber>2</followUpObjectNumber>
<followUpObjectTargetNumber>3</followUpObjectTargetNumber>
<followUpObjectName>kostensoort</followUpObjectName>
<followUpObjectValue desc="kostensoort1">kostensoort1</followUpObjectValue>
</followUpObject>
<followUpObject length="6">
<followUpObjectNumber>3</followUpObjectNumber>
<followUpObjectTargetNumber>2</followUpObjectTargetNumber>
<followUpObjectName>Project</followUpObjectName>
<followUpObjectValue desc="">2412</followUpObjectValue>
</followUpObject>
</followUpObjects>

Я использую этот кусок xslt:

<CodingField>
<xsl:for-each
select="followUpObject[followUpObjectName='Kostenplaats']"></xsl:for-
each>
<Type>
<xsl:text>Costcenter</xsl:text>
</Type>
<Text>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue"/>
</Text>
<Name>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue/@desc"/>    
</Name>
<TextDetail>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue"/>
</TextDetail>
<ShowAsSubLine>
<xsl:text>false</xsl:text>
</ShowAsSubLine>
</CodingField>
<CodingField>
<xsl:for-each
select="./followUpObject[followUpObjectName='kostensoort']"></xsl:for-
each>
<Type>
<xsl:text>Costunit</xsl:text>
</Type>
<Text>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue"/>
</Text>
<Name>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue/@desc"/>    
</Name>
<TextDetail>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue"/>
</TextDetail>
<ShowAsSubLine>
<xsl:text>false</xsl:text>
</ShowAsSubLine>
</CodingField>
<CodingField>
<xsl:for-each
select="./followUpObject[followUpObjectName='Project']"></xsl:for-each>
<Type>
<xsl:text>Project</xsl:text>
</Type>
<Text>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue"/>
</Text>
<Name>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue/@desc"/>    
</Name>
<TextDetail>
<xsl:value-of
select="followUpObjects/followUpObject/followUpObjectValue"/>
</TextDetail>
<ShowAsSubLine>
<xsl:text>false</xsl:text>
</ShowAsSubLine>
</CodingField>

Но я получаю это каждый раз:

Type Costcenter
Text 5260
Name Kwaliteitsdienst
TextDetail 5260

Type Costunit
Text 5260
Name Kwaliteitsdienst
TextDetail 5260

Type Project
Text 5260
Name Kwaliteitsdienst
TextDetail 5260

Как видите, первый дочерний элемент используется каждый раз для заполнения любого другого поля кодирования, кроме типа (который я жестко запрограммировал).

1 Ответ

0 голосов
/ 05 ноября 2018

У вас есть три пустых блока xsl:for-each. Например ...

<xsl:for-each select="followUpObject[followUpObjectName='Kostenplaats']"></xsl:for-each>

Вы должны поместить код, который вы хотите выполнить, для каждого элемента внутри xsl:for-each, а не после него.

<CodingField>
  <xsl:for-each select="followUpObject[followUpObjectName='Kostenplaats']">
    <Type>
      <xsl:text>Costcenter</xsl:text>
    </Type>
    <Text>
      <xsl:value-of select="followUpObjectValue"/>
    </Text>
    <Name>
      <xsl:value-of select="followUpObjectValue/@desc"/>   
    </Name>
    <TextDetail>
      <xsl:value-of select="followUpObjectValue"/>
    </TextDetail>
    <ShowAsSubLine>
      <xsl:text>false</xsl:text>
    </ShowAsSubLine>
  </xsl:for-each>
</CodingField>

Обратите внимание, что операторам xsl:value-of не требуется полный патч, но они относятся к followUpObject, который вы выбираете.

Сказав это, xsl:for-each выбирает только один элемент, и вы не хотите повторять этот код три раза. Поэтому вместо xsl:for-each выберите все элементы ....

Попробуйте это XSLT

 <xsl:for-each select="followUpObject">
   <CodingField>
    <Type>
      <xsl:choose>
        <xsl:when test="followUpObjectName = 'Kostenplaats'">Costcenter</xsl:when>
        <xsl:when test="followUpObjectName = 'kostensoort'">Costunit</xsl:when>
        <xsl:otherwise>Project</xsl:otherwise>
      </xsl:choose>
    </Type>
    <Text>
      <xsl:value-of select="followUpObjectValue"/>
    </Text>
    <Name>
      <xsl:value-of select="followUpObjectValue/@desc"/>   
    </Name>
    <TextDetail>
      <xsl:value-of select="followUpObjectValue"/>
    </TextDetail>
    <ShowAsSubLine>
      <xsl:text>false</xsl:text>
    </ShowAsSubLine>
  </CodingField>
</xsl:for-each>

См. Это в действии на http://xsltfiddle.liberty -development.net / pPqsHUo / 1

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