繁体   English   中英

如何使用XSLT根据另一个节点的内容获取XML节点的值?

[英]How can I get the values of XML nodes depending on the content of another node by using XSLT?

根据XSLT,这是我的第一个问题。 我想通过使用XSLT转换XML结构。

我的XML来源的相关部分

<field tag="ElementName">
  <subfield code="S">p</subfield>
  <subfield code="a">Content 1 for S=P</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">p</subfield>
  <subfield code="a">Content 2 for S=P</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">p</subfield>
  <subfield code="a">Content 3 for S=P</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">g</subfield>
  <subfield code="a">Content 1 for S=G</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">g</subfield>
  <subfield code="a">Content 2 for S=G</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">s</subfield>
  <subfield code="a">Content 1 for S=S</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">s</subfield>
  <subfield code="a">Content 2 for S=S</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">s</subfield>
  <subfield code="a">Content 3 for S=S</subfield>
</field>
<field tag="ElementName">
  <subfield code="S">s</subfield>
  <subfield code="a">Content 4 for S=S</subfield>
</field>

接下来,我希望转换后XML如下所示

<field tag="ElementName_P">
  <subfield code="a">Content 1 for S=P</subfield>
  <subfield code="a">Content 2 for S=P</subfield>
  <subfield code="a">Content 3 for S=P</subfield>
</field>
<field tag="ElementName_G">
  <subfield code="a">Content 1 for S=G</subfield>
  <subfield code="a">Content 2 for S=G</subfield>
</field>
<field tag="ElementName_S">
  <subfield code="a">Content 1 for S=S</subfield>
  <subfield code="a">Content 2 for S=S</subfield>
  <subfield code="a">Content 3 for S=S</subfield>
  <subfield code="a">Content 4 for S=S</subfield>
</field>

我知道如何使用xsl:variable和xsl:value-of获得属性值和字段值。 我想知道的是如何使用code =“ a”将子字段中的内容分组。 已经尝试了几个小时。 使用XPath是否有可能?

谢谢支持!

作为示例,如何在XSLT 1.0中完成此操作:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" encoding="utf-8" method="xml" 
            omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
  <xsl:key name="sCode" match="subfield[@code='S']" use="." />
  <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
  <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

  <xsl:template match="field">
    <xsl:for-each select="subfield[generate-id() =
                          generate-id(key('sCode', .)[1])]">
      <xsl:variable name="elements" select="key('sCode', .)" />
      <field>
        <xsl:attribute name="tag" select="concat('ElementName_', 
                                  translate($elements, $smallcase, $uppercase))"/>
        <xsl:apply-templates select="//subfield[(./text() =  $elements)]"
                             mode="sorted"/>  
      </field>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="subfield" mode="sorted">
     <xsl:copy>
        <xsl:attribute name="code" select="."/>
        <xsl:value-of select="./following-sibling::subfield[@code='a']"/>
     </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

当应用于输入XML时,输出

<field tag="ElementName_P">
  <subfield code="p">Content 1 for S=P</subfield>
  <subfield code="p">Content 2 for S=P</subfield>
  <subfield code="p">Content 3 for S=P</subfield>
</field>
<field tag="ElementName_G">
  <subfield code="g">Content 1 for S=G</subfield>
  <subfield code="g">Content 2 for S=G</subfield>
</field>
<field tag="ElementName_S">
  <subfield code="s">Content 1 for S=S</subfield>
  <subfield code="s">Content 2 for S=S</subfield>
  <subfield code="s">Content 3 for S=S</subfield>
  <subfield code="s">Content 4 for S=S</subfield>
</field>

如果您使用的是XSLT 2.0,则无需转换输出中ElementName标记的代码值,而只需使用函数uppercase()

作为XSLT分组的参考,您可以查看例如http://www.jenitennison.com/xslt/grouping/muenchian.xmlhttp://www.dpawson.co.uk/xsl/sect2/N4486.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM