xslt - 元数据名称长度的任何限制?

时间:2015-06-02 18:05:00

标签: xslt

我是这个论坛的新手。我需要解析/读取一个包含大量元数据的xml(如下所示)。我有两个读取基于bu值的特定元值,例如,如果我的bu值是' 987654321abcdefghijklmnopaslasjdoiwneois123abc'我必须得到价值" d581452fa9ba3110VgnVCM10000038ccc5abRCRD | def"。我的问题是,元数据名称长度是否有任何限制?由于某种原因,我的xslt逻辑没有读取这个值(select =" MT [@ N = $ partialval] / @ V")。

XSLT代码段

   <xsl:for-each select='./MT[@N="bu"]'>
  <xsl:variable name="temp_bu" select="./@V"/>
  <xsl:variable name="partialval" select="'987654321abcdefghijklmnopaslasjdoiwneois123abc'"/>
  <xsl:if test="contains($partialval, $temp_bu)">
    <xsl:variable name="partialbuval" select="MT[@N=$partialval]/@V"/>
    <xsl:value-of disable-output-escaping='yes' select="concat('file://',$partialbuval,'test',$partialval)"/>
  </xsl:if> 
  </xsl:for-each>

示例xml结构:

    <MT N="bu" V="12345678910111121314sdnfske34234123234abc"/>
    <MT N="12345678910111121314sdnfske34234123234abc" V="02715148a3e7a110VgnVCM1000001b89c5abRCRD|abc"/>
    <MT N="12345678910111121314sdnfske34234123234abc_name" V="Item one"/>
    <MT N="bu" V="987654321abcdefghijklmnopaslasjdoiwneois123abc"/>
    <MT N="987654321abcdefghijklmnopaslasjdoiwneois123abc" V="d581452fa9ba3110VgnVCM10000038ccc5abRCRD|def"/>
    <MT N="987654321abcdefghijklmnopaslasjdoiwneois123abc_name" V="Item two"/>
    <MT N="bu" V="qqqqqwwwweeeee1112223333ssdfff3334sssssabc"/>
    <MT N="qqqqqwwwweeeee1112223333ssdfff3334sssssabc" V="d581452fa9ba3110VgnVCM10000038ccc5abRCRD|ghi"/>
    <MT N="qqqqqwwwweeeee1112223333ssdfff3334sssssabc_name" V="Item three"/>
    <MT N="bu" V="hhhheeeertisodfnsdifwoein12345sfjsoif234defgh"/>
    <MT N="hhhheeeertisodfnsdifwoein12345sfjsoif234defgh" V="d581452fa9ba3110VgnVCM10000038ccc5abRCRD|jkl"/>
    <MT N="hhhheeeertisodfnsdifwoein12345sfjsoif234defgh_name" V="Item four"/>

输出视为(此字符串中缺少partialbuval值) &#34;文件:// test987654321abcdefghijklmnopaslasjdoiwneois123abc&#34;

我不确定我在这里做错了什么。感谢您能帮助我。

谢谢, Amarnath

1 个答案:

答案 0 :(得分:0)

我不确定我理解你的要求。但是在下面:

<xsl:for-each select="./MT[@N="bu"]">
   <xsl:variable ... select="MT[@N=$partialval]/@V"/>
</xsl:for-each>

第二个select永远不会选择任何内容。那是因为xsl:for-each改变了上下文。因此,在xsl:for-each(也称为序列构造函数)的主体内,上下文项查看的当前MT元素xsl:for-each的当前迭代中。

因此,第二个选择表达式要求任何MT元素,当前MT元素的直接子元素,并且没有任何元素。

额外的提示:./在XPath表达式的开头总是毫无意义。启动带点的表达式的唯一情况是.//。因此./MT始终等同于MT,这也更具可读性。