在XSLT 1.0中使用逗号分割值时出现问题

时间:2012-08-14 10:05:52

标签: xslt xslt-1.0

我正在尝试使用XSLT1.0从xml中拆分一个值,我有一个类似

的XML
<employees>
    <examples>
       <example id="1,2,3">
       </example>
    </examples>

   <emp id="1">
     <name>john</name>
   </emp>
   <emp id="2">
     <name>raj</name>
   </emp>
   <emp id="3">
     <name>sat</name>
   </emp>

</employees>

我需要从示例标记中提取id并将其拆分并从emp标记中获取值,表示输出应为

<employees>
    <employee>
        <id>1</id>
        <name>john</name>
    </employee>
    <employee>
        <id>2</id>
        <name>raj</name>
    </employee>
    <employee>
        <id>3</id>
        <name>sat</name>
    </employee>

</employees>

1 个答案:

答案 0 :(得分:0)

我认为,而不是试图将示例元素上的@id属性拆分,这在XSLT1-0中有点混乱,您可以尝试匹配 \ temp 元素,其@id出现在属性的

 <xsl:variable name="ids" select="concat(',', examples/example/@id, ',')"/>
 <xsl:apply-templates select="emp[contains($ids, concat(',', @id, ','))]"/>

请注意使用逗号来确保@id为1并未被示例@id为11

这是完整的XSLT

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

   <xsl:template match="employees">
      <employees>
         <xsl:variable name="ids" select="concat(',', examples/example/@id, ',')"/>
         <xsl:apply-templates select="emp[contains($ids, concat(',', @id, ','))]"/>
      </employees>
   </xsl:template>

   <xsl:template match="emp">
      <employee>
         <id>
            <xsl:value-of select="@id"/>
         </id>
         <xsl:apply-templates select="node()"/>
      </employee>
   </xsl:template>

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

当应用于您的示例XML时,输出以下内容

<employees>
   <employee>
      <id>1</id>
      <name>john</name>
   </employee>
   <employee>
      <id>2</id>
      <name>raj</name>
   </employee>
   <employee>
      <id>3</id>
      <name>sat</name>
   </employee>
</employees>