我正在尝试使用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>
非常感谢任何帮助。
答案 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-Nicolle
或d'Angelo
或MacNamara
等名称而适得其反。
答案 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>