이것이 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를 사용할 가능성이 있습니까?
지원을위한 Thx!
예를 들어 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.xml 및 http://www.dpawson.co.uk/xsl/sect2/N4486.html을 참조 할 수 있습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다