Xml 限制XSLT文本提取到特定字段

Xml 限制XSLT文本提取到特定字段,xml,xslt,text,extraction,Xml,Xslt,Text,Extraction,对XSLT来说还是相当陌生的;我试图使用XSLT(1.0)从XML文件中提取某些字段,并且仅提取某些字段。下面是实际XML文档的简化形式: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Transaction> <TradeMarkTransactionBody> <TransactionContentDetails> <TransactionCode

对XSLT来说还是相当陌生的;我试图使用XSLT(1.0)从XML文件中提取某些字段,并且仅提取某些字段。下面是实际XML文档的简化形式:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transaction>
  <TradeMarkTransactionBody>
    <TransactionContentDetails>
      <TransactionCode>National Trademark Information</TransactionCode>
      <TransactionData>
        <TradeMarkDetails>
          <TradeMark>
            <RegistrationOfficeCode>US</RegistrationOfficeCode>
            <ApplicationNumber>74631225</ApplicationNumber>
            <ApplicationDate>1995-02-07-05:00</ApplicationDate>
            <RegistrationNumber>2178784</RegistrationNumber>
            <RegistrationDate>1998-08-04-04:00</RegistrationDate>
            <FilingPlace>US</FilingPlace>
            <MarkCurrentStatusDate>2008-08-11-04:00</MarkCurrentStatusDate>
            <WordMarkSpecification>
              <MarkVerbalElementText>JAVA </MarkVerbalElementText>
            </WordMarkSpecification>
          </TradeMark>
        </TradeMarkDetails>
      </TransactionData>
    </TransactionContentDetails>
  </TradeMarkTransactionBody>
</Transaction>
我的问题:1)如何避免拾取不需要的数据,如输出中的
TransactionCode
(“
国家商标信息
”);2)如何避免<代码>到期日期>代码>和<代码> MaqValBeleTimeTe> <代码>之间的空行?(我已经确认它不是XSLT文件中的空行;将它们排除在外并不起作用。)


(我怀疑这两个问题可能只有一个答案;不知何故,我保留了未选中的
markorbalElementText
text,以及一些未选中的换行符。)

你就快到了。您的第一个模板“消耗”了整个文档,如果您只需要
商标
标记,只需将其应用于感兴趣的标记即可

<xsl:template match="Transaction">
    <xsl:apply-templates select=".//TradeMark"/>
</xsl:template>

这里对提供的转换进行了轻微的修改和简化(删除了一个不必要的模板)——现在生成了所需的正确结果

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:strip-space elements="*"/>

 <xsl:template match="TradeMark">
    MarkCurrentStatusDate,"<xsl:value-of select="MarkCurrentStatusDate"/>"
    ApplicationNumber,"<xsl:value-of select="ApplicationNumber"/>"
    ApplicationDate,"<xsl:value-of select="ApplicationDate"/>"
    RegistrationNumber,"<xsl:value-of select="RegistrationNumber"/>"
    RegistrationDate,"<xsl:value-of select="RegistrationDate"/>"
    ExpirationDate,"<xsl:value-of select="ExpirationDate"/><xsl:text>"</xsl:text>
    <xsl:apply-templates select="WordMarkSpecification"/>
 </xsl:template>

 <xsl:template match="WordMarkSpecification">
    MarkVerbalElementText,"<xsl:value-of select="normalize-space(MarkVerbalElementText)"/>"
 </xsl:template>

 <xsl:template match="TransactionCode"/>
</xsl:stylesheet>
说明

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:strip-space elements="*"/>

 <xsl:template match="TradeMark">
    MarkCurrentStatusDate,"<xsl:value-of select="MarkCurrentStatusDate"/>"
    ApplicationNumber,"<xsl:value-of select="ApplicationNumber"/>"
    ApplicationDate,"<xsl:value-of select="ApplicationDate"/>"
    RegistrationNumber,"<xsl:value-of select="RegistrationNumber"/>"
    RegistrationDate,"<xsl:value-of select="RegistrationDate"/>"
    ExpirationDate,"<xsl:value-of select="ExpirationDate"/><xsl:text>"</xsl:text>
    <xsl:apply-templates select="WordMarkSpecification"/>
 </xsl:template>

 <xsl:template match="WordMarkSpecification">
    MarkVerbalElementText,"<xsl:value-of select="normalize-space(MarkVerbalElementText)"/>"
 </xsl:template>

 <xsl:template match="TransactionCode"/>
</xsl:stylesheet>
  • 空体模板:

    用于重写与元素匹配的XSLT内置模板,该模板生成匹配元素的所有文本节点子体的串联

  • 行尾的
    可防止以下新行字符被解释为所需输出的一部分,从而消除观察到的空行

  • 匹配
    事务的模板将被删除,因为它的行为与匹配元素的XSLT内置模板完全相同——将模板应用于其所有子元素

  • 下面是另一种(有些复杂的)拉动方法:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:util="urn:util">
    
        <xsl:output
            method="text" 
            encoding="utf-8"/>
    
        <xsl:strip-space elements="*"/>
    
        <xsl:variable name="fields" select="document('')/*/util:fields"/>
        <util:fields>
            <field>MarkCurrentStatusDate</field>
            <field>ApplicationNumber</field>
            <field>ApplicationDate</field>
            <field>RegistrationNumber</field>
            <field>RegistrationDate</field>
            <field>ExpirationDate</field>
            <field>MarkVerbalElementText</field>
        </util:fields>
    
        <xsl:template match="/">
            <xsl:variable name="xml" select="."/>
            <xsl:for-each select="$fields/field">
                <xsl:variable name="f" select="."/>
                <xsl:value-of select="$f"/>
                <xsl:text>="</xsl:text>
                <xsl:value-of select="normalize-space($xml//TradeMark//*[local-name() = $f])"/>
                <xsl:text>"&#x000A;</xsl:text>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    

    我不太相信它能超过您提供的示例XML,但它确实在那里起作用。

    非常感谢。我发现它解决了提取问题,并进行了一些实验(我从XSLT手册中提取,但必须仔细阅读才能理解),也能去掉空白。谢谢。我将比较两个答案(两个都有效)并希望更好地理解这些方法。我发现我实际上有3个空行,但通过在每个模板的MarkCurrentStatusDate选择的开始和最后一个选择的结束处放置,我能够抑制所有。Dimitre,如果我理解你建议的方法,我需要指定不提取的元素,对吗?因为这是一个简化的示例,在一个包含许多其他元素的更完整的示例中,我需要为每个元素添加一个空模板,对吗?@user1564935,不客气。您接受的答案不能解决您的空行问题。此外,它是“拉式”的,而这个答案是纯“推式”的。建议使用“推式”转换拉式“由于更大的灵活性/可扩展性/可维护性而导致的错误。@user1564935,不,在大多数情况下,您可以组合任何一组元素名称,并在单个模板中指定它们。但我要忽略的每个元素都必须标识,对吗?”?在非简化的情况下会有点毛茸茸的。实际上,我扔掉了大约80%的数据,只保留了一些数据。
    <Transaction>
        <TradeMarkTransactionBody>
            <TransactionContentDetails>
                <TransactionCode>National Trademark Information</TransactionCode>
                <TransactionData>
                    <TradeMarkDetails>
                        <TradeMark>
                            <RegistrationOfficeCode>US</RegistrationOfficeCode>
                            <ApplicationNumber>74631225</ApplicationNumber>
                            <ApplicationDate>1995-02-07-05:00</ApplicationDate>
                            <RegistrationNumber>2178784</RegistrationNumber>
                            <RegistrationDate>1998-08-04-04:00</RegistrationDate>
                            <FilingPlace>US</FilingPlace>
                            <MarkCurrentStatusDate>2008-08-11-04:00</MarkCurrentStatusDate>
                            <WordMarkSpecification>
                                <MarkVerbalElementText>JAVA </MarkVerbalElementText>
                            </WordMarkSpecification>
                        </TradeMark>
                    </TradeMarkDetails>
                </TransactionData>
            </TransactionContentDetails>
        </TradeMarkTransactionBody>
    </Transaction>
    
    MarkCurrentStatusDate,"2008-08-11-04:00"
    ApplicationNumber,"74631225"
    ApplicationDate,"1995-02-07-05:00"
    RegistrationNumber,"2178784"
    RegistrationDate,"1998-08-04-04:00"
    ExpirationDate,""
    MarkVerbalElementText,"JAVA"
    
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:util="urn:util">
    
        <xsl:output
            method="text" 
            encoding="utf-8"/>
    
        <xsl:strip-space elements="*"/>
    
        <xsl:variable name="fields" select="document('')/*/util:fields"/>
        <util:fields>
            <field>MarkCurrentStatusDate</field>
            <field>ApplicationNumber</field>
            <field>ApplicationDate</field>
            <field>RegistrationNumber</field>
            <field>RegistrationDate</field>
            <field>ExpirationDate</field>
            <field>MarkVerbalElementText</field>
        </util:fields>
    
        <xsl:template match="/">
            <xsl:variable name="xml" select="."/>
            <xsl:for-each select="$fields/field">
                <xsl:variable name="f" select="."/>
                <xsl:value-of select="$f"/>
                <xsl:text>="</xsl:text>
                <xsl:value-of select="normalize-space($xml//TradeMark//*[local-name() = $f])"/>
                <xsl:text>"&#x000A;</xsl:text>
            </xsl:for-each>
        </xsl:template>
    </xsl:stylesheet>
    
    MarkCurrentStatusDate="2008-08-11-04:00"
    ApplicationNumber="74631225"
    ApplicationDate="1995-02-07-05:00"
    RegistrationNumber="2178784"
    RegistrationDate="1998-08-04-04:00"
    ExpirationDate=""
    MarkVerbalElementText="JAVA"