programing

XSLT에 스플릿() 기능이 있습니까?

muds 2023. 5. 26. 22:52
반응형

XSLT에 스플릿() 기능이 있습니까?

노드에 문자열이 있는데 '?'에 문자열을 분할하고 배열의 마지막 항목을 반환하려고 합니다.

예를 들어, 아래 블록에서:

<a>
    <xsl:attribute name="href">
        /newpage.aspx?<xsl:value-of select="someNode"/>
    </xsl:attribute>
    Link text
</a>

저는 나눠 주세요.someNode가치.

편집: 여기 VB가 있습니다.내 Asp용 Xsl을 로드하는 데 사용하는 네트.넷 페이지:

Dim xslDocPath As String = HttpContext.Current.Server.MapPath("~/App_Data/someXslt.xsl")
Dim myXsltSettings As New XsltSettings()
Dim myXMLResolver As New XmlUrlResolver()

myXsltSettings.EnableScript = True
myXsltSettings.EnableDocumentFunction = True

myXslDoc = New XslCompiledTransform(False)
myXslDoc.Load(xslDocPath, myXsltSettings, myXMLResolver)

Dim myStringBuilder As New StringBuilder()
Dim myXmlWriter As XmlWriter = Nothing

Dim myXmlWriterSettings As New XmlWriterSettings()
myXmlWriterSettings.ConformanceLevel = ConformanceLevel.Auto
myXmlWriterSettings.Indent = True
myXmlWriterSettings.OmitXmlDeclaration = True

myXmlWriter = XmlWriter.Create(myStringBuilder, myXmlWriterSettings)

myXslDoc.Transform(xmlDoc, argumentList, myXmlWriter)

Return myStringBuilder.ToString()

업데이트: 다음은 특정 노드에서 XML을 분할하는 입니다.

재귀적 방법 사용:

<xsl:template name="output-tokens">
    <xsl:param name="list" /> 
    <xsl:variable name="newlist" select="concat(normalize-space($list), ' ')" /> 
    <xsl:variable name="first" select="substring-before($newlist, ' ')" /> 
    <xsl:variable name="remaining" select="substring-after($newlist, ' ')" /> 
    <id>
        <xsl:value-of select="$first" /> 
    </id>
    <xsl:if test="$remaining">
        <xsl:call-template name="output-tokens">
            <xsl:with-param name="list" select="$remaining" /> 
        </xsl:call-template>
    </xsl:if>
</xsl:template>

만약 당신이 XSLT 2.0 이상을 사용할 수 있다면, 당신은tokenize(string, separator):

tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")

w3schools XPath 함수 참조를 참조하십시오.

기본적으로 .NET은 XSLT 3.0은 물론 XSLT 2.0도 지원하지 않습니다..NET용으로 알려진 2.0 이상의 프로세서는 IKVM을 사용하는 .NET용 Saxon, 현재 베타 버전인 .NET XSLT 3.0 프로세서인 ExseltXMLPrime XSLT 2.0 프로세서뿐입니다.

저는 그 기능을 사용하게 되었습니다.제가 성공한 것은 다음과 같습니다.

<a>
    <xsl:attribute name="href">
        /newpage.aspx?<xsl:value-of select="substring-after(someNode, '?')"/>
    </xsl:attribute>
    Link text
</a>

XSLT 버전을 2.0으로 설정한 후에도 여전히 "'tokenize()' is an unknown XSLT function.사용할 때 오류 발생tokenize().

템플릿 엔진이 EXSLT를 지원하는 경우 토큰화()사용할 수 있습니다.

예:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:str="http://exslt.org/strings"
                extension-element-prefixes="str">

...
  <a>
    <xsl:attribute name="href">
      <xsl:text>/newpage.aspx?</xsl:text>
      <xsl:value-of select="str:tokenize(someNode)[2]"/>
    </xsl:attribute>              
  </a>
...
</xsl:stylesheet>

.NET은 XSLT 2.0을 지원하지 않습니다.는 그것이 스플릿() 기능이 있는 EXSLT를 지원한다고 꽤 확신합니다.Microsoft는 EXSLT 구현에 대한 이전 페이지를 가지고 있습니다.

다음을 사용하여 템플릿을 작성할 수 있습니다.string-before그리고.string-after기능을 사용할 수 있습니다.저는 이것에 대해 블로그를 썼습니다.

마지막으로 구분된 문자열을 하위 문자열로 분할하는 xslt 템플릿을 만들었습니다.저는 그것이 가장 현명한 대본이라고 주장하지는 않지만, 확실히 제 문제를 해결해줍니다.

스타일시트:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="Paths/Item">
<xsl:call-template name="SplitText">
<xsl:with-param name="inputString" select="Path"/>
<xsl:with-param name="delimiter" select="Delimiter"/>
</xsl:call-template>
<br/>
</xsl:for-each>
</xsl:template>
<xsl:template name="SplitText">
<xsl:param name="inputString"/>
<xsl:param name="delimiter"/>
<xsl:choose>
<xsl:when test="contains($inputString, $delimiter)">
<xsl:value-of select="substring-before($inputString,$delimiter)"/>
<xsl:text disable-output-escaping = "no"> </xsl:text>
<xsl:call-template name="SplitText">
<xsl:with-param name="inputString" select="substring-after($inputString,$delimiter)"/>
<xsl:with-param name="delimiter" select="$delimiter"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$inputString = ''">
<xsl:text></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$inputString"/>
<xsl:text> </xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

XML 파일(변환할):

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="textSpliter.xslt"?>
<Paths>
  <Item>
    <Path>C:\ProgramFiles\SomeWierdSoftware</Path>
    <Delimiter>\</Delimiter>
  </Item>
</Paths> 

XSLT 1.0에는 분할 기능 자체가 없지만 잠재적으로 하위 문자열 이전 및 하위 문자열 이후 기능을 사용하여 수행하려는 작업을 수행할 수 있습니다.

또는 Microsoft XSLT 엔진을 사용하는 경우 인라인 C#을 사용할 수 있습니다.

참고로 1.0으로 이 작업을 수행하고 있는데 분할/토키즈가 정말 필요하다면 xslt 확장자가 필요합니다.

언급URL : https://stackoverflow.com/questions/136500/does-xslt-have-a-split-function

반응형