проблема производительности xsl - PullRequest
0 голосов
/ 26 января 2011

У меня проблемы с производительностью картографа xsl. Вот пример xsl (примечание: реальный xsl продолжается 10 000 строк)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var" version="1.0" xmlns:ns3="http://microsoft.com/HealthCare/HL7/2X/2.3.1/Tables" xmlns:ns4="http://microsoft.com/HealthCare/HL7/2X/2.3.1/DataTypes" xmlns:ns0="http://microsoft.com/HealthCare/HL7/2X/2.3.1/Segments" xmlns:ns2="http://microsoft.com/HealthCare/HL7/2X" xmlns:ns1="http://Cegeka.C2M.Accelerator.Schemas.segments_C2M">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:template match="/">
  <xsl:apply-templates select="/ns2:ADT_231_GLO_DEF" />
</xsl:template>
<xsl:template match="/ns2:ADT_231_GLO_DEF">
<ns2:ADT_231_GLO_DEF>
  <xsl:for-each select="EVN_EventType">
    <EVN_EventType>
      <xsl:if test="normalize-space(EVN_1_EventTypeCode/text())">
        <EVN_1_EventTypeCode>
          <xsl:value-of select="EVN_1_EventTypeCode/text()" />
        </EVN_1_EventTypeCode>
      </xsl:if>
      <EVN_2_RecordedDateTime>
        <xsl:if test="normalize-space(EVN_2_RecordedDateTime/TS_0_TimeOfAnEvent/text())">
          <TS_0_TimeOfAnEvent>
            <xsl:value-of select="EVN_2_RecordedDateTime/TS_0_TimeOfAnEvent/text()" />
          </TS_0_TimeOfAnEvent>
        </xsl:if>
      </EVN_2_RecordedDateTime>
      <xsl:for-each select="EVN_3_DateTimePlannedEvent">
        <xsl:if test="normalize-space(TS_0_TimeOfAnEvent/text())">
          <EVN_3_DateTimePlannedEvent>
            <TS_0_TimeOfAnEvent>
              <xsl:value-of select="TS_0_TimeOfAnEvent/text()" />
            </TS_0_TimeOfAnEvent>
          </EVN_3_DateTimePlannedEvent>
        </xsl:if>
      </xsl:for-each>
      <xsl:if test="normalize-space(EVN_4_EventReasonCode/text())">
        <EVN_4_EventReasonCode>
          <xsl:value-of select="EVN_4_EventReasonCode/text()" />
        </EVN_4_EventReasonCode>
      </xsl:if>
    </EVN_EventType>
    </xsl:for-each>
   </ns2:ADT_231_GLO_DEF>
   </xsl:template>
  </xsl:stylesheet>

Итак, что я делаю:

- I copy the nodes I want from the source xml
- I don't copy the empty nodes or the nodes that contain a break (hence why I check normalize-space(/text())

Теперь время выполнения составляет около 1 секунды, это нормально? Я использую это отображение в biztalk, которое обычно может обрабатывать не менее 10 сообщений в секунду (если не намного больше: p), но эта карта вызывает задержку, поэтому я могу обрабатывать только 1 сообщение в секунду: (

Теперь, к сожалению, я не гуру xsl, поэтому, если кто-нибудь может дать мне какой-нибудь совет, это приветствуется:)

Thx

1 Ответ

2 голосов
/ 26 января 2011

Я копирую нужные мне узлы из исходного XML

Я не копирую пустые узлы или узлы, содержащие разрыв (поэтому я проверяю пространство нормализации)

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

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

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

<xsl:template match="*[not(normalize-space()) and not(*) and not(@*)]"/>

</xsl:stylesheet>

Второй , вы можете попытаться удалить неиспользуемые пробелы во время компиляции, используя:

<xsl:strip-space elements="*"/>

Таким образом, ваш документ будет храниться в памяти без незначительных пробелов и, следовательно, будет более кратким.

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