XSLT находит соответствующий узел, сравнивая текст элемента с результатом подстроки - PullRequest
1 голос
/ 11 августа 2011

Я обрабатываю этот XML:

<Brand>
<Brand_Name>BLENDERM</Brand_Name>
<Brand_Code>1103</Brand_Code>
<Groups>
<Group>
<Group_Code>657</Group_Code>
<Parent_Code>0</Parent_Code>
<Group_Level>1</Group_Level>
<Group_Name>Brand Default</Group_Name>
<Product>
<Pip_code>0032359</Pip_code>
<Status>In Use</Status>

Использование этого XSLT:

<xsl:template match="Product" mode="phase-3">
<xsl:value-of select="document('rx_catmapping.xml')/descendant::mapping[source=substring(ancestor::Brand/Brand_Name,1,1)]/target"/>
</xsl:template>

Вот пример файла rx_catmapping.xml:

<Lookup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <mapping>
        <source>a</source>
        <target>788</target>
    </mapping>
    <mapping>
        <source>B</source>
        <target>789</target>
    </mapping>
</Lookup>

Итак, я обрабатываю элемент Product, который является потомком Brand. Первая буква Brand/Brand_Name в этом случае - B, и я пытаюсь вывести значение 789, посмотрев его в rx_catmapping.xml. Это должно быть действительно просто, но я полностью озадачен! Я попытался изменить первую часть XPath, чтобы она ссылалась на document('rx_catmapping.xml')/Lookup/mapping или document('rx_catmapping.xml')//mapping. Я также пытался изменить первую половину сравнения на string(source) или source/text(), но ни одна из этих работ не работает. (Причиной попытки было то, что, например, использование source='B', похоже, работало, поэтому я подумал, не пытаюсь ли я сравнить два несовместимых типа данных.)

Заранее спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Определите ключ

<xsl:key name="k1" match="mapping" use="source"/>

, затем используйте

<xsl:variable name="map-doc" select="document('rx_catmapping.xml')"/>

и

<xsl:variable name="letter" select="substring(ancestor::Brand/Brand_Name,1,1)"/>
<xsl:for-each select="$map-doc">
  <xsl:value-of select="key('k1', $letter)/target"/>
</xsl:for-each>

С XSLT 2.0 вы можете упростить это до

<xsl:value-of select="key('k1', substring(ancestor::Brand/Brand_Name,1,1), $map-doc)"/>
0 голосов
/ 11 августа 2011

Проблема, как мне кажется, в том, что в момент, когда вы делаете ancestor::Brand/Brand_Name, контекст - это элемент mapping во внешнем файле.Это сработало для меня

  <xsl:template match="/">
    <xsl:apply-templates select=".//Product"/>
  </xsl:template>
  <xsl:template match="Product">
    <xsl:variable name="x" select="substring(ancestor::Brand/Brand_Name,1,1)"/>
      <xsl:value-of select="document('file:///c:/temp/rx_catmapping.xml')//mapping[source=$x]/target"/>
  </xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...