开发者

XSLT finding matching node by comparing element text to substring result

I am processing this 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>

Using this 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>

Here is a sample of 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>

So, I am processing the Product element, which is a descendant of Brand. The first letter of Brand/Brand_Name in this case is B, and I am trying to output the value 789 by looking it up in rx_catmapping.xml. This should be really simple but I am completely stumped! I have tried changing the first part of the XPath to refer to document('rx_catmapping.xml')/Lookup/mapping, or document('rx_catmapping.xml')//mapping. I have also tried changing the first 开发者_StackOverflow社区half of the comparison to string(source), or to source/text(), but neither of these works either. (The reason for trying this was that using source='B', for example, did seem to work, so I wondered if I was trying to compare two incompatible data types.)

Thanks in advance for your help.


Define a key

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

then use

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

and

<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>

With XSLT 2.0 you can simplify that to

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


The problem is, I believe, that at the point where you do ancestor::Brand/Brand_Name, the context is the mapping element in the external file. This worked for me

  <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>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜