xslt добавить значение по умолчанию, если элемент не существует - PullRequest
4 голосов
/ 11 июля 2011

Я пытаюсь проверить, существует ли элемент. Если это не так, я бы хотел добавить значение по умолчанию. Вот мой XML

<records>
  <record>
    <InstanceData>
      <instance>
        <FirstName>Johhny</FirstName>
        <LastName>Jenkins</LastName>
        <AlbumCount>3</AlbumCount>
      </instance>
    </InstanceData>
  </record>
  <record>
    <InstanceData>
      <instance>
        <FirstName>Art</FirstName>
        <LastName>Tatum</LastName>
        <AlbumCount>7</AlbumCount>
      </instance>
    </InstanceData>
  </record>
  <record>
    <InstanceData>
      <instance>
        <FirstName>Count</FirstName>
        <LastName>Basie</LastName>
      </instance>
    </InstanceData>
  </record>
</records>

Я бы хотел иметь возможность скопировать существующие значения и установить любую запись без элемента «Количество альбомов» на <AlbumCount>0</AlbumCount>. Это xslt, с которым я работаю, но я думаю, что я немного не в курсе.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0"> 
  <xsl:template match="Records">
    <xsl:for-each select="node()">
      <xsl:choose>
        <xsl:when test="name()='AlbumCount'">
          <xsl:element name="AlbumCount">
            <xsl:choose>
              <xsl:when test="name()='AlbumCount'">
                <xsl:copy-of select=".">
                </xsl:copy-of>
              </xsl:when>
              <xsl:otherwise>
                <AlbumCount>0</AlbumCount>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:copy-of select=".">
          </xsl:copy-of>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Спасибо за внимание.

Ответы [ 2 ]

8 голосов
/ 11 июля 2011

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

<?xml version="1.0" encoding="UTF-8"?>
<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" omit-xml-declaration="no"/>

<!-- identity template -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="instance[not(AlbumCount)]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <AlbumCount>0</AlbumCount>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>   

Начните с преобразования идентификаторов, затем просто обработайте исключение по-другому.

3 голосов
/ 11 июля 2011

Вы проверяете наличие элемента просто с именем элемента, например:

<xsl:if test="not(AlbumCount)">
  <AlbumCount>0</AlbumCount>
</xsl:if>

Более простой способ сделать то, что вы хотите, это использовать стандартный шаблон копирования в сочетании со специальным правиломместа, где необходимо добавить элементы AlbumCount:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <!-- Standard copy template -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Special template to add AlbumCount elements where required -->
  <xsl:template match="records/record/InstanceData/instance">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
      <xsl:if test="not(AlbumCount)">
        <AlbumCount>0</AlbumCount>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...