【问题标题】:how to get the tag value in XSLT如何在 XSLT 中获取标记值
【发布时间】:2016-03-02 09:41:22
【问题描述】:

我有一个示例 XML

<document>
<item>
    <gtin>1000909090</gtin>
    <flex>

        <pegMeasurements>
            <pegHoleNumber>2</pegHoleNumber>
            <pegHorizontal uom="CMT">10</pegHorizontal>
            <pegVertical uom="INH">20</pegVertical>
            <pegHoleType>ES1</pegHoleType>
        </pegMeasurements>
    </flex>
</item>
</document>

我正在使用的 XSLT

<xsl:stylesheet 
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output indent="yes"/>


<xsl:template match="document"> 
    <CatalogItem>
        <RelationshipData>
            <Relationship>
                <RelationType>Item_Master_TRADEITEM_TEMPERATURE_MVL</RelationType>  
                <RelatedItems>      
                    <xsl:for-each select="item/flex/pegMeasurements//@uom">                                     
                        <RelatedItem>
                            <xsl:attribute name="referenceKey">
                                <xsl:value-of select="concat('TradeItemTemperatureInformation_MVL','-', .,'-', ../../pegHoleNumber,'-', ../../pegHoleType ,'-',name(../),'-' )"/>
                            </xsl:attribute>
                        </RelatedItem>
                    </xsl:for-each>


                </RelatedItems>
            </Relationship>
        </RelationshipData>
    </CatalogItem>

</xsl:template> 

</xsl:stylesheet>

我能够读取除数据末尾的 10 和 20 的 pegHorizo​​ntal 和 pegVertical 值之外的所有值。

预期的输出应该是

<?xml version="1.0" encoding="UTF-8"?>
<CatalogItem>
<RelationshipData>
  <Relationship>
     <RelationType>Item_Master_TRADEITEM_TEMPERATURE_MVL</RelationType>
     <RelatedItems>
        <RelatedItem referenceKey="TradeItemTemperatureInformation_MVL-CMT-2-ES1-pegHorizontal-10" />
        <RelatedItem referenceKey="TradeItemTemperatureInformation_MVL-INH-2-ES1-pegVertical-20" />
     </RelatedItems>
  </Relationship>

有人可以指导最后附加什么代码。请不要更改完整的代码,因为我还有其他部分。

【问题讨论】:

    标签: xml xslt xml-parsing xslt-1.0 xslt-2.0


    【解决方案1】:

    试试:

    <xsl:value-of select="concat('TradeItemTemperatureInformation_MVL-', ., '-', ../../pegHoleNumber, '-', ../../pegHoleType, '-', name(..), '-', ..)"/>
    

    或者更方便一点:

    ...
    <RelatedItems>      
        <xsl:for-each select="item/flex/pegMeasurements"> 
            <xsl:variable name="num" select="pegHoleNumber" />
            <xsl:variable name="typ" select="pegHoleType" />
            <xsl:for-each select="*[@uom]">
                <RelatedItem>
                    <xsl:attribute name="referenceKey">
                        <xsl:text>TradeItemTemperatureInformation_MVL-</xsl:text>
                        <xsl:value-of select="@uom"/>
                        <xsl:text>-</xsl:text>
                        <xsl:value-of select="$num"/>
                        <xsl:text>-</xsl:text>
                        <xsl:value-of select="$typ"/>
                        <xsl:text>-</xsl:text>
                        <xsl:value-of select="name()"/>
                        <xsl:text>-</xsl:text>
                        <xsl:value-of select="."/>
                    </xsl:attribute>
                </RelatedItem>
            </xsl:for-each>
        </xsl:for-each>
    </RelatedItems>
    ...
    

    【讨论】:

      【解决方案2】:

      给定输入:

      <document>
        <item>
          <gtin>1000909090</gtin>
          <flex>
            <pegMeasurements>
              <pegHoleNumber>2</pegHoleNumber>
              <pegHorizontal uom="CMT">10</pegHorizontal>
              <pegVertical uom="INH">20</pegVertical>
              <pegHoleType>ES1</pegHoleType>
            </pegMeasurements>
          </flex>
        </item>
      </document>
      

      并给出 XSLT 样式表:

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output indent="yes"/>
      
      
      <xsl:template match="document"> 
      <CatalogItem>
          <RelationshipData>
              <Relationship>
                  <RelationType>Item_Master_TRADEITEM_TEMPERATURE_MVL</RelationType>  
                  <RelatedItems>      
                    <xsl:for-each select="item/flex/pegMeasurements//@uom">
                      <RelatedItem>
                        <xsl:attribute name="referenceKey">
                          <xsl:variable name="peg-hole-number" select="../../pegHoleNumber/text()"/>
                          <xsl:variable name="peg-name" select="name(parent::*)"/>
                          <xsl:variable name="peg-uom-value" select="parent::*/@uom"/>
                          <xsl:variable name="peg-value" select="parent::*/text()"/>
                          <xsl:variable name="peg-hole-type" select="../../pegHoleType/text()"/>
      
                          <xsl:value-of select="concat('TradeItemTemperatureInformation_MVL-', $peg-uom-value, '-', $peg-hole-number, '-', $peg-hole-type, '-', $peg-name, '-', $peg-value)"/>
                        </xsl:attribute>
                       </RelatedItem>
                    </xsl:for-each>
                  </RelatedItems>
              </Relationship>
          </RelationshipData>
      </CatalogItem>
      

      产量输出:

      <?xml version="1.0" encoding="UTF-8"?>
      <CatalogItem>
      <RelationshipData>
          <Relationship>
              <RelationType>Item_Master_TRADEITEM_TEMPERATURE_MVL</RelationType>
              <RelatedItems>
                  <RelatedItem referenceKey="TradeItemTemperatureInformation_MVL-CMT-2-ES1-pegHorizontal-10"/>
                  <RelatedItem referenceKey="TradeItemTemperatureInformation_MVL-INH-2-ES1-pegVertical-20"/>
              </RelatedItems>
          </Relationship>
      </RelationshipData>
      

      编辑: 没有使用模板,因为 OP 不希望代码更改太多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 2014-05-31
        • 2021-10-30
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        相关资源
        最近更新 更多