Как сравнить два тега и сгенерировать шаблон xml, используя xlst - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть xml с тегом, updateTypes с возможными значениями "LINE", "HEADER". Это может быть только «LINE» или «HEADER». Или Это может быть комбинация «LINE» и «HEADER».

XML с LINE и HEADER

<message>
    <orderOfficeId>1</orderOfficeId>
    <channelMthdCd>1</channelMthdCd>
    <updateTypes>LINE</updateTypes>
    <updateTypes>HEADER</updateTypes>
<message>

XML с LINE

<message>
    <orderOfficeId>1</orderOfficeId>
    <channelMthdCd>1</channelMthdCd>
    <updateTypes>LINE</updateTypes>
<message>

XML с HEADER

<message>
    <orderOfficeId>1</orderOfficeId>
    <channelMthdCd>1</channelMthdCd>
    <updateTypes>HEADER</updateTypes>
<message>

Вот мой xslt, который должен генерировать xml на основе значения updateType. Это работало нормально для одного возможного случая. Но он не работает для нескольких значений для этого тега. Могу ли я убедиться, что он должен работать эффективно на основе значений, это может быть один updateType или комбинация обоих.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<MESSAGE>
    <SEG>
        <xsl:choose>
            <xsl:when test="message/updateTypes= 'HEADER'">
              <HEAD>
                  <TEST>HEAD</TEST>
                  <TYP>C</TYP>
              </HEAD>
            </xsl:when>
        </xsl:choose>

        <xsl:choose>
            <xsl:when test="message/updateTypes= 'LINE' and 'HEADER'">
              <HEAD>
                  <TEST>HEAD</TEST>
                  <TYP>D</TYP>
              </HEAD>
            </xsl:when>
        </xsl:choose>

        <xsl:choose>
            <xsl:when test="message/updateTypes= 'LINE'">
               <HEAD>
                  <TEST>HEAD</TEST>
                  <TYP>B</TYP>
              </HEAD>
            </xsl:when>
        </xsl:choose>   

    </SEG>
</MESSAGE>
</xsl:template>
</xsl:stylesheet>

ВЫХОД:

<message>
      <SEG>
         <HEAD>
              <TEST>HEAD</TEST>
              <TYP>B</TYP>
          </HEAD>
      </SEG>
    <message>

ОЖИДАЕМЫЙ ВЫХОД:

<message>
      <SEG>
         <HEAD>
              <TEST>HEAD</TEST>
              <TYP>D</TYP>
          </HEAD>
      </SEG>
    <message>

1 Ответ

1 голос
/ 16 апреля 2020

Если я правильно угадываю, вы хотите сделать:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/message">
    <MESSAGE>
        <SEG>
            <HEAD>
                <TEST>HEAD</TEST>
                <TYP>
                    <xsl:choose>
                        <xsl:when test="updateTypes='HEADER' and updateTypes='LINE'">D</xsl:when>
                        <xsl:when test="updateTypes='LINE'">B</xsl:when>
                        <xsl:when test="updateTypes='HEADER'">C</xsl:when>
                    </xsl:choose>
                </TYP>
            </HEAD>
        </SEG>
    </MESSAGE>
</xsl:template>

</xsl:stylesheet>

Обратите внимание, что порядок тестов имеет значение; xsl:choose вернет содержимое первого xsl:when элемента, чей test вернет true.

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