将XSLT应用于XML中的camelcase特定元素

时间:2017-09-08 19:55:05

标签: xml xslt

我正在尝试使用XSLT获取三个XML元素,并且我没有连接关于如何将XSLT模板应用于特定元素的点。

以下是XML的示例:

<?xml version="1.0" encoding="us-ascii"?>
<jsi:CitationCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:j="http://niem.gov/niem/domains/jxdm/4.0" xmlns:nc="http://niem.gov/niem/niem-core/2.0" xmlns:s="http://niem.gov/niem/structures/2.0" xmlns:jsi="http://www.justicesystems.com/iepd" xsi:schemaLocation="http://www.justicesystems.com/iepd extension-schema.xsd">
  <jsi:CitationDocument>
    <nc:Person>
        <nc:PersonName>
            <nc:PersonGivenName>FIRST NAME</nc:PersonGivenName>
            <nc:PersonMiddleName>MIDDLE NAME</nc:PersonMiddleName>
            <nc:PersonSurName>LAST NAME</nc:PersonSurName>
          </nc:PersonName>
    </nc:Person>
  </jsi:CitationDocument>
</jsi:CitationCollection>  

这是我目前的XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="CamelCase">
  <xsl:param name="text"/>
  <xsl:choose>
    <xsl:when test="contains($text,' ')">
      <xsl:call-template name="CamelCaseWord">
        <xsl:with-param name="text" select="substring-before($text,' ')"/>
      </xsl:call-template>
      <xsl:text> </xsl:text>
      <xsl:call-template name="CamelCase">
        <xsl:with-param name="text" select="substring-after($text,' ')"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="CamelCaseWord">
        <xsl:with-param name="text" select="$text"/>
      </xsl:call-template>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template name="CamelCaseWord">
  <xsl:param name="text"/>
  <xsl:value-of select="translate(substring($text,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" /><xsl:value-of select="translate(substring($text,2,string-length($text)-1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
</xsl:template>

</xsl:stylesheet>

这就是我想要的:

<jsi:CitationCollection>
  <jsi:CitationDocument>
    <nc:Person>
        <nc:PersonName>
            <nc:PersonGivenName>First Name</nc:PersonGivenName>
            <nc:PersonMiddleName>Middle Name</nc:PersonMiddleName>
            <nc:PersonSurName>Last Name</nc:PersonSurName>
          </nc:PersonName>
    </nc:Person>
  </jsi:CitationDocument>
</jsi:CitationCollection> 

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我建议你这样试试:

XSLT 1.0

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

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

<xsl:template match="text()" name="capitalize-words">
    <xsl:param name="text" select="."/>
    <xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
    <xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
    <xsl:variable name="word" select="substring-before(concat($text, ' '), ' ')" />
    <xsl:value-of select="translate(substring($word, 1, 1), $lowercase, $uppercase)" />
    <xsl:value-of select="translate(substring($word, 2), $uppercase, $lowercase)" />
    <xsl:if test="contains($text, ' ')">
        <xsl:text> </xsl:text>
        <!-- recursive call -->
        <xsl:call-template name="capitalize-words">
            <xsl:with-param name="text" select="substring-after($text, ' ')"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

请注意,这会因Anne-Nicolled'AngeloMacNamara等名称而适得其反。

答案 1 :(得分:1)

您可以将文本节点上的模板与

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

<xsl:template name="CamelCase" match="text()[normalize-space()]">
    <xsl:param name="text" select="."/>
    <xsl:choose>
        <xsl:when test="contains($text, ' ')">
            <xsl:call-template name="CamelCaseWord">
                <xsl:with-param name="text" select="substring-before($text, ' ')"/>
            </xsl:call-template>
            <xsl:text> </xsl:text>
            <xsl:call-template name="CamelCase">
                <xsl:with-param name="text" select="substring-after($text, ' ')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="CamelCaseWord">
                <xsl:with-param name="text" select="$text"/>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template name="CamelCaseWord">
    <xsl:param name="text"/>
    <xsl:value-of
        select="translate(substring($text, 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
    <xsl:value-of
        select="translate(substring($text, 2), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"
    />
</xsl:template>